विचार
मैं आपको उसी दृष्टिकोण की सिफारिश करूंगा जिसका उपयोग Instagram द्वारा किया जाता है . ऐसा लगता है कि उनकी आवश्यकताएँ आपकी आवश्यकताओं का बारीकी से पालन करती हैं।
<ब्लॉकक्वॉट>जेनरेट की गई आईडी समय के अनुसार क्रमबद्ध होनी चाहिए (इसलिए फोटो आईडी की एक सूची, उदाहरण के लिए, फोटो के बारे में अधिक जानकारी प्राप्त किए बिना क्रमबद्ध की जा सकती है) आईडी आदर्श रूप से 64 बिट्स (छोटे इंडेक्स के लिए, और रेडिस जैसे सिस्टम में बेहतर स्टोरेज के लिए) होनी चाहिए। संभव के रूप में कुछ नए 'चलने वाले हिस्से'—हम बहुत कम इंजीनियरों के साथ Instagram को कैसे स्केल करने में सक्षम हुए हैं इसका एक बड़ा हिस्सा सरल, समझने में आसान समाधान चुनकर है जिस पर हम भरोसा करते हैं।
वे एक ऐसी प्रणाली के साथ आए जिसमें टाइमस्टैम्प के आधार पर 41 बिट्स, 13 ओ डेटाबेस शार्ड और 10 ऑटो वृद्धि वाले हिस्से के लिए हैं। चूंकि आप शार्क का उपयोग नहीं कर रहे हैं। आपके पास समय आधारित कॉपमोनेंट के लिए केवल 41 बिट्स और यादृच्छिक रूप से चुने गए 23 बिट्स हो सकते हैं। यदि आप एक ही समय में रिकॉर्ड सम्मिलित करते हैं, तो संघर्ष होने की 8.3 मिलियन संभावना में से 1 की संभावना बहुत कम है। लेकिन व्यवहार में आप इसके हिट होने की संभावना कभी नहीं रखते हैं। ठीक है तो कैसे कुछ कोड के बारे में:
आईडी जनरेट करना
START_TIME = a constant that represents a unix timestamp
def make_id():
'''
inspired by http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram
'''
t = int(time.time()*1000) - START_TIME
u = random.SystemRandom().getrandbits(23)
id = (t << 23 ) | u
return id
def reverse_id(id):
t = id >> 23
return t + START_TIME
ध्यान दें, START_TIME
उपरोक्त कोड में कुछ मनमाना प्रारंभ समय है। आप time.time()*1000 का उपयोग कर सकते हैं, मान प्राप्त कर सकते हैं और इसे START_TIME
. के रूप में सेट कर सकते हैं
ध्यान दें कि reverse_id
मेरे द्वारा पोस्ट की गई विधि आपको यह पता लगाने की अनुमति देती है कि रिकॉर्ड किस समय बनाया गया था। यदि आपको उस जानकारी पर नज़र रखने की आवश्यकता है तो आप इसके लिए कोई अन्य फ़ील्ड जोड़े बिना ऐसा कर सकते हैं! तो आपकी प्राथमिक कुंजी वास्तव में आपके संग्रहण को बढ़ाने के बजाय सहेज रही है!
मॉडल
अब आपका मॉडल इस तरह दिखेगा।
class MyClass(models.Model):
id = models.BigIntegerField(default = fields.make_id, primary_key=True)
यदि आप django के बाहर अपने डेटाबेस में परिवर्तन करते हैं तो आपको make_id
के समकक्ष बनाना होगा एक sql फ़ंक्शन के रूप में
एक फुट नोट के रूप में। यह कुछ हद तक Mongodb द्वारा इसे _ID जेनरेट करने के तरीके के समान है। प्रत्येक वस्तु के लिए।