Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara mengganti kunci utama Django dengan bilangan bulat berbeda yang unik untuk tabel itu

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan pemicu MySQL

  2. MySQL menambahkan hari ke tanggal

  3. Matikan peringatan dan kesalahan pada PHP dan MySQL

  4. Mengelompokkan klausa WHERE di Codeigniter

  5. C# dengan parameter MySQL INSERT