Ý 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.