Ide
Saya akan merekomendasikan kepada Anda pendekatan yang sama yang digunakan oleh Instagram . Persyaratan mereka tampaknya sangat mengikuti kebutuhan Anda.
ID yang dihasilkan harus dapat diurutkan berdasarkan waktu (jadi daftar ID foto, misalnya, dapat diurutkan tanpa mengambil informasi lebih lanjut tentang foto tersebut) ID idealnya harus 64 bit (untuk indeks yang lebih kecil, dan penyimpanan yang lebih baik dalam sistem seperti Redis) Sistem harus memperkenalkan sebagai sesedikit mungkin 'bagian yang bergerak'—sebagian besar cara kami dapat menskalakan Instagram dengan sedikit insinyur adalah dengan memilih solusi sederhana dan mudah dipahami yang kami percayai.
Mereka datang dengan sistem yang memiliki 41 bit berdasarkan timestamp, 13 o database shard dan 10 untuk porsi kenaikan otomatis. Karena Anda tampaknya tidak menggunakan pecahan. Anda hanya dapat memiliki 41 bit untuk komponen berbasis waktu dan 23 bit dipilih secara acak. Itu menghasilkan kemungkinan 1 dalam 8,3 juta yang sangat tidak mungkin untuk mendapatkan konflik jika Anda memasukkan catatan pada saat yang sama. Tetapi dalam praktiknya Anda tidak akan pernah mencapai ini. Benar jadi bagaimana dengan beberapa kode:
Membuat ID
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
Perhatikan, START_TIME
dalam kode di atas adalah beberapa waktu mulai yang sewenang-wenang. Anda dapat menggunakan time.time()*1000 , dapatkan nilainya dan setel sebagai START_TIME
Perhatikan bahwa reverse_id
metode saya telah diposting memungkinkan Anda untuk mengetahui pada waktu mana catatan itu dibuat. Jika Anda perlu melacak informasi itu, Anda dapat melakukannya tanpa harus menambahkan bidang lain untuk itu! Jadi, kunci utama Anda sebenarnya menghemat penyimpanan Anda daripada meningkatkannya!
Modelnya
Sekarang seperti inilah model Anda nantinya.
class MyClass(models.Model):
id = models.BigIntegerField(default = fields.make_id, primary_key=True)
Jika Anda membuat perubahan pada basis data Anda di luar Django, Anda perlu membuat yang setara dengan make_id
sebagai fungsi sql
Sebagai catatan kaki. Ini agak seperti pendekatan yang digunakan oleh Mongodb untuk menghasilkan _ID itu untuk setiap objek.