जैसा अल्बर्टो फेरारी द्वारा देखा गया
और यहां StackOverflow पर चर्चा की गई
, Microsoft SQL सर्वर एक विशिष्ट क्रम में बाइट्स की तुलना करके GUIDs को सॉर्ट करता है। चूंकि MySQL एक BINARY(16)
को सॉर्ट करेगा "स्ट्रेट-फॉरवर्ड", हमें बस इतना करना है कि डेटाबेस को पढ़ते/लिखते समय बाइट्स को फिर से व्यवस्थित करना है।
NHibernate हमें कस्टम डेटा प्रकारों को परिभाषित करने की अनुमति देता है, जिसका उपयोग डेटाबेस और ऑब्जेक्ट्स के बीच मैपिंग में किया जा सकता है। मैंने एक BinaryGuidType
लागू किया है , Guid.ToByteArray()
जिस तरह से MSSQL GUID को सॉर्ट करता है और उन्हें द्वारा स्वीकृत प्रारूप में वापस क्रमित करता है। Guid(byte[])
कंस्ट्रक्टर।
बाइट क्रम इस तरह दिखता है:
int[] ByteOrder = new[] { 10,11,12,13,14,15,8,9,6,7,4,5,0,1,2,3 };
एक System.Guid
सहेजा जा रहा है एक BINARY(16)
. के लिए इस तरह जाता है:
var bytes = ((Guid) value).ToByteArray();
var reorderedBytes = new byte[16];
for (var i = 0; i < 16; i++)
{
reorderedBytes[i] = bytes[ByteOrder[i]];
}
NHibernateUtil.Binary.NullSafeSet(cmd, reorderedBytes, index);
बाइट्स को वापस एक System.Guid
. में पढ़ना इस तरह जाता है:
var bytes = (byte[]) NHibernateUtil.Binary.NullSafeGet(rs, names[0]);
if (bytes == null || bytes.Length == 0) return null;
var reorderedBytes = new byte[16];
for (var i = 0 ; i < 16; i++)
{
reorderedBytes[ByteOrder[i]] = bytes[i];
}
BinaryGuidType
के लिए पूर्ण स्रोत कोड यहाँ।
ऐसा लगता है कि यह अच्छा काम करता है। तालिका में 10.000 नए ऑब्जेक्ट बनाना और बनाए रखना, वे पूरी तरह से क्रमिक रूप से संग्रहीत किए जाते हैं, जिसमें अनुक्रमणिका विखंडन के कोई संकेत नहीं होते हैं।