Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách thay thế khóa chính của Django bằng một số nguyên khác duy nhất cho bảng đó

Ý tưởng

Tôi muốn giới thiệu cho bạn phương pháp tương tự được sử dụng bởi Instagram . Các yêu cầu của họ dường như tuân theo chặt chẽ của bạn.

Các ID đã tạo phải có thể sắp xếp theo thời gian (vì vậy, một danh sách các ID ảnh, ví dụ, có thể được sắp xếp mà không cần tìm nạp thêm thông tin về ảnh chụp) ID lý tưởng nên là 64 bit (đối với các chỉ mục nhỏ hơn và lưu trữ tốt hơn trong các hệ thống như Redis) càng ít 'bộ phận chuyển động' mới càng tốt — một phần lớn cách chúng tôi có thể cải tiến Instagram với rất ít kỹ sư là bằng cách chọn các giải pháp đơn giản, dễ hiểu mà chúng tôi tin tưởng.

Họ đã đưa ra một hệ thống có 41 bit dựa trên dấu thời gian, 13 bit cho phân đoạn cơ sở dữ liệu và 10 cho phần tăng tự động. Có vẻ như bạn không sử dụng phân đoạn. Bạn chỉ có thể có 41 bit cho một phần phụ dựa trên thời gian và 23 bit được chọn ngẫu nhiên. Điều đó tạo ra nguy cơ xảy ra xung đột là 1 trong 8,3 triệu cực kỳ khó xảy ra nếu bạn chèn các bản ghi cùng một lúc. Nhưng trong thực tế, bạn không bao giờ có khả năng đạt được điều này. Đúng vậy làm thế nào về một số mã:

Tạo 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 

Lưu ý, START_TIME trong đoạn mã trên là một số thời gian bắt đầu trọng tài. Bạn có thể sử dụng time.time () * 1000, lấy giá trị và đặt thành START_TIME

Lưu ý rằng reverse_id phương pháp tôi đã đăng cho phép bạn tìm hiểu thời điểm bản ghi được tạo. Nếu bạn cần theo dõi thông tin đó, bạn có thể làm như vậy mà không cần phải thêm trường khác cho nó! Vì vậy, khóa chính của bạn thực sự đang tiết kiệm bộ nhớ của bạn hơn là tăng nó!

Mô hình

Bây giờ đây là mô hình của bạn trông như thế nào.

class MyClass(models.Model):
   id = models.BigIntegerField(default = fields.make_id, primary_key=True)  

Nếu bạn thực hiện các thay đổi đối với cơ sở dữ liệu của mình bên ngoài django, bạn sẽ cần phải tạo make_id tương đương dưới dạng một hàm sql

Như một lưu ý chân. Điều này hơi giống phương pháp được Mongodb sử dụng để tạo _ID cho từng đối tượng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhập csv vào mysql qua dòng lệnh

  2. PDO ::PARAM cho kiểu thập phân?

  3. Cách cập nhật nhiều cột trong MySQL

  4. Mysql:Chọn tất cả dữ liệu giữa hai ngày

  5. Làm cách nào để lưu trữ và truy xuất hình ảnh từ cơ sở dữ liệu MySQL bằng PHP?