Ba vấn đề có thể nảy sinh trong đầu là:
Với bất kỳ tài nguyên được chia sẻ nào, bạn đang tạo ra một nút cổ chai tiềm năng. Ruột của tôi nói rằng đối với tải trọng cao nhất của bạn thì đây không phải là vấn đề nhưng tôi thực sự khuyên bạn nên điểm chuẩn bất kỳ giải pháp nào như vậy trong một môi trường có quy mô sản xuất giống như sản xuất.
Về cơ bản, bạn đang gán ý nghĩa cho việc thay thế các khóa đánh bại một phần mục đích của chúng trong lý thuyết RDB. Một khóa thay thế theo bản chất của nó không nên có ý nghĩa ngoài việc là một khóa để xác định các bộ dữ liệu trong mối quan hệ đó. Nếu các thực thể có thể có ý nghĩa với nhau và vì vậy cần các khóa không va chạm, có đúng là chúng đang được mô hình riêng biệt hoặc có một cái gì đó bị bỏ sót trong các yêu cầu và / hoặc thiết kế mô hình dữ liệu không?
Bạn đang giới thiệu một điểm tiềm năng của sự thất bại. Điều gì xảy ra nếu việc triển khai không được thiết lập điểm bắt đầu trình tự ban đầu? Sau đó, bạn có lỗi chặn triển khai hoặc triển khai bắt đầu từ cùng một nơi "phá vỡ" tính năng của bạn. Ngoài ra, bạn sẽ làm gì nếu ở đâu đó, ai đó nghĩ rằng đó là một ý tưởng tốt để phân nhánh triển khai (trong sản xuất có lẽ một công ty thuê sẽ thoái một phần của chính họ và cần tách dữ liệu). Điều gì xảy ra nếu hạt giống bằng cách nào đó được thiết lập lại bởi một triển khai nâng cấp xấu hoặc di chuyển khác? [0]
Nếu không có vấn đề nào liên quan đến bạn thì hãy tiếp tục, ý tưởng sẽ không phá vỡ bất cứ điều gì IMO. Tất nhiên có thể có những cách tốt hơn ngay cả khi cách này không sai.
Khi bạn nói "UUID-lite", bạn ngụ ý rằng bạn đã xem xét và giảm giá các UUID. Đó có phải là trường hợp không, và nếu vậy có những lý do đặc biệt để quyết định rằng chúng không phù hợp với dự án này?
Một lý do có thể cho việc không sử dụng UUID là phân mảnh chỉ mục mặc dù tầm quan trọng của điều đó thường được nêu quá nhiều [1] . Câu trả lời của SQL Server cho điều này là "GUID tuần tự" tương đối giống với những gì bạn đang đề xuất nếu chúng tôi giảm giá gán ý nghĩa cho các giá trị chính - có lẽ postgres có tương đương với điều đó không? Tất nhiên, luôn luôn tăng chỉ số có thể có các vấn đề về hiệu suất của riêng họ (sự tranh chấp ở trang cuối, chỉ số ngày càng tăng) trong một số khối lượng công việc lớn rất cụ thể [2] .
Một đối số phổ biến khác chống lại UUID là độ dài khóa: tại sao sử dụng 16 byte cho mỗi giá trị khi 4 hoặc 8 sẽ đủ? Nếu tính duy nhất thực sự là một tài sản hữu ích thì điều này thường sẽ gây ra những lo ngại về kích thước khóa đáng kể. Nếu kích thước khóa là một mối quan tâm nhưng bạn rất vui khi sử dụng INT 64 bit thay vì cần giữ bên trong 32 bit, bạn có thể sử dụng kỹ thuật của mình mà không cần thêm vấn đề tranh chấp tài nguyên chia sẻ tiềm năng bằng cách thực hiện ý tưởng khóa số nguyên có hạt giống của bạn trên mỗi bảng [3] bằng cách sử dụng định nghĩa cột INT IDENTITY(<start>, 1)
[4] bình thường , mặc dù một lần nữa, đây là thêm độ phức tạp triển khai (một lượng nhỏ, nhưng chắc chắn không phải bằng không).
Khả năng đọc của con người đôi khi được trích dẫn là một vấn đề, nhưng điều đó quay trở lại việc gán ý nghĩa cho các khóa thay thế.
Khả năng nén là một mối quan tâm ít phổ biến hơn nhưng bạn có thể gặp phải. Đối với bất kỳ thuật toán nén nào, UUID có thể trông giống như dữ liệu ngẫu nhiên (không thể nén) trừ khi bạn đang sử dụng một cái gì đó như UUID tuần tự của máy chủ SQL. Đây có thể là mối quan tâm đối với một tập hợp liên kết rất lớn (hoặc khối dữ liệu khác) có chứa nhiều ID thực thể được cung cấp cho một ứng dụng qua mạng chậm hoặc nếu cần sử dụng một cái gì đó như các tính năng nén chỉ mục của SQL Server, mặc dù cả hai vấn đề này về cơ bản chỉ là khôi phục mối quan tâm về kích thước khóa theo một cách hơi khác và các UUID tuần tự cũng có thể giúp ích ở đây.
[0] điều này cũng có thể xảy ra đối với các cột nhận dạng thông thường, nhưng vì bạn đang sử dụng một tính năng ít phổ biến hơn, bạn sẽ tăng cơ hội cho một DBA ít kinh nghiệm hơn sau khi bạn bỏ lỡ vấn đề nếu nó xảy ra khi bạn đang làm điều gì đó mới mẻ và thú vị nơi khác
[1] Tôi là một người máy chủ SQL, tôi nghi ngờ vấn đề tiềm ẩn là giống nhau ở postgres nhưng đối với tất cả tôi biết nó có thể có bố cục chỉ mục khác nhau có thể làm giảm hiệu ứng.
[2] Mặc dù một lần nữa, đây có thể là SQL Server cụ thể, đặc biệt là ví dụ sau trong hai ví dụ tôi liệt kê
[3] Hai byte trên cùng: thay đổi theo cơ sở dữ liệu, hai tiếp theo: thay đổi theo bảng, bốn còn lại: các bit tăng dần
[4] Đó là cú pháp MS SQL Server, cú pháp postgres có thể khác nhau nhưng bạn nên xem ý tôi là gì và có thể dịch
tl; dr: nếu bạn thấy mình đang phát minh lại bánh xe, hãy đảm bảo rằng tất cả các thiết kế hiện có thực sự không phù hợp trước khi bắt đầu xem xét lý do tại sao một cái mới có thể hoặc không thể.