Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Django की प्राथमिक कुंजी को एक अलग पूर्णांक के साथ कैसे बदलें जो उस तालिका के लिए अद्वितीय है

विचार

मैं आपको उसी दृष्टिकोण की सिफारिश करूंगा जिसका उपयोग 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 जेनरेट करने के तरीके के समान है। प्रत्येक वस्तु के लिए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं MySQL का उपयोग करके दो तिथियों के बीच क्वेरी कैसे करूं?

  2. Mysql के साथ अंतिम डाली गई आईडी पुनर्प्राप्त करें

  3. MySQL किसी फ़ील्ड में कुछ टेक्स्ट खोजें और बदलें

  4. डीबीएमएस द्वारा स्कीमा परिभाषाएं

  5. MySQL डायनेमिक पिवट टेबल