giải pháp điển hình cho bất kỳ cơ sở dữ liệu quan hệ có thể là một bảng như
user_invoice_numbers (user_id int primary key clustered, last_id int)
và một thủ tục lưu trữ hoặc một truy vấn SQL như
update user_invoice_numbers set last_id = last_id + 1 where user_id = @user_id
select last_id from user_invoice_numbers where user_id = @user_id
Nó sẽ làm việc cho người sử dụng (nếu mỗi người dùng có một vài đồng thời chạy các giao dịch) nhưng sẽ không hoạt động cho các công ty (ví dụ khi bạn cần các công ty_invoice_numbers) vì các giao dịch từ những người dùng khác nhau trong cùng một công ty có thể chặn lẫn nhau và sẽ có một nút cổ chai hiệu suất trong bảng này.
Yêu cầu chức năng quan trọng nhất bạn nên kiểm tra là liệu hệ thống của bạn có được phép có khoảng trống trong đánh số hóa đơn hay không. Khi bạn sử dụng auto_increment tiêu chuẩn, bạn cho phép khoảng trống, bởi vì trong hầu hết cơ sở dữ liệu tôi biết, khi bạn quay lại giao dịch, số tăng lên sẽ không được cuộn lại. Lưu ý điều này, bạn có thể cải thiện hiệu suất bằng cách sử dụng một trong các nguyên tắc sau đây
1) Loại trừ quy trình bạn sử dụng để nhận số mới từ các giao dịch đang chạy dài. Giả sử rằng chèn vào hóa đơn thủ tục là một giao dịch dài chạy với logic phía máy chủ phức tạp. Trong trường hợp này, trước tiên bạn có được một id mới, và sau đó, trong giao dịch riêng biệt, hãy chèn hóa đơn mới. Nếu giao dịch cuối cùng sẽ được khôi phục, số tự động sẽ không giảm.Nhưng user_invoice_numbers sẽ không bị khóa trong thời gian dài, vì vậy nhiều người dùng đồng thời có thể chèn hóa đơn cùng lúc
2) Không sử dụng cơ sở dữ liệu giao dịch truyền thống để lưu trữ dữ liệu với id cuối cùng cho mỗi người dùng. Khi bạn cần duy trì danh sách các khóa và giá trị đơn giản, có rất nhiều công cụ cơ sở dữ liệu nhỏ nhưng nhanh có thể làm việc đó cho bạn. List of Key/Value databases. Có lẽ memcached là phổ biến nhất. Trong quá khứ, tôi đã thấy các dự án có kho khóa/giá trị đơn giản được triển khai bằng Windows Registry hoặc thậm chí là một hệ thống tệp. Có một thư mục trong đó mỗi tên tệp là khóa và bên trong mỗi tệp là id cuối cùng. Và giải pháp thô này vẫn tốt hơn sau đó sử dụng bảng SQL, bởi vì ổ khóa đã được ban hành và phát hành rất nhanh chóng và không tham gia vào phạm vi giao dịch.
Vâng, nếu đề xuất tối ưu hóa của tôi có vẻ là quá phức tạp cho dự án của bạn, hãy quên điều này ngay bây giờ, cho đến khi bạn thực sự sẽ gặp sự cố về hiệu suất. Trong hầu hết các dự án, phương pháp đơn giản với một bảng bổ sung sẽ hoạt động khá nhanh.
Tôi không cho phép chỉnh sửa/xóa hóa đơn, để đơn giản hóa toàn bộ điều một chút (không có khoảng trống). Nhưng tôi không lo lắng về hiệu suất ngay bây giờ. Cảm ơn –
memcached không phải là công cụ cơ sở dữ liệu: http://code.google.com/p/memcached/wiki/FAQ#How_can_I_use_memcached_as_a_database? –
Nếu bạn sử dụng bất kỳ công nghệ nào có thể dẫn đến khoảng trống (khi nó xuất hiện từ câu trả lời tự động trả lời này) thì bạn có thể giảm ganh đua bằng cách cho phép nhận trước các đoạn từ chuỗi. Trường hợp xấu nhất bạn mất đoạn không sử dụng. – djna