Tôi đang sử dụng Django và PostgreSQL, nhưng tôi không hoàn toàn ràng buộc với ORM Django nếu có cách tốt hơn để làm điều này với SQL thô hoặc các hoạt động cụ thể của cơ sở dữ liệu.Cấu trúc dữ liệu để lưu trữ trường sắp xếp có hiệu quả cho phép sửa đổi
Tôi có một mô hình cần đặt hàng tuần tự. Các hoạt động tra cứu thường sẽ lấy toàn bộ danh sách theo thứ tự. Các hoạt động phổ biến nhất trên dữ liệu này là để di chuyển một hàng để dưới cùng của danh sách, với một tập hợp con của các mục can thiệp bọt lên để thay thế cho mục trước như thế này:
(operation on A, with subset B, C, E) A -> B B -> C C -> E D -> D E -> A Notice how D does not move.
Nói chung, các tập hợp con của các mặt hàng sẽ không nhiều hơn 50 mục, nhưng danh sách cơ sở có thể tăng lên đến hàng chục nghìn mục.
Cách rõ ràng nhất để thực hiện điều này là với trường đơn hàng số nguyên đơn giản. Điều này có vẻ tối ưu. Nó đòi hỏi sự thỏa hiệp làm cho cột sắp xếp vị trí không phải là duy nhất, trong đó tính không duy nhất chỉ được yêu cầu trong suốt thời gian hoạt động sửa đổi. Để thấy điều này, hãy tưởng tượng hoạt động tối thiểu bằng cách sử dụng A có tập con B:
oldpos = B.pos
B.pos = A.pos
A.pos = oldpos
Mặc dù bạn đã lưu trữ vị trí, dòng thứ hai bạn đã vi phạm ràng buộc duy nhất. Ngoài ra, phương pháp này làm cho vấn đề atomicity - hoạt động đọc của bạn phải xảy ra trước khi ghi, trong thời gian đó các bản ghi của bạn có thể thay đổi. Tài liệu xử lý giao dịch mặc định của Django không giải quyết vấn đề này, mặc dù tôi biết có thể có trong SQL bằng cách sử dụng khóa giao dịch "REPEATABLE READ".
Tôi đang tìm các cấu trúc dữ liệu thay thế phù hợp với mô hình sử dụng này chặt chẽ hơn. Tôi đã xem xét this question để biết các ý tưởng.
Một đề nghị đó là Dewey giải pháp phong cách thập phân, mà làm cho các hoạt động chèn xảy ra bằng số giữa các giá trị hiện có, do đó chèn Một giữa kết quả B và C trong:
A=1 -> B=2 B=2 -> A=2.5 C=3 -> C=3
này giải quyết vấn đề cột độc đáo, nhưng đưa ra vấn đề là cột phải là phao của một số thập phân được chỉ định. Hoặc tôi ước tính quá mức và lưu trữ nhiều dữ liệu hơn mức cần thiết hoặc hệ thống bị giới hạn bởi bất kỳ độ dài thập phân tùy ý nào mà tôi áp đặt. Hơn nữa, tôi không mong đợi sử dụng thậm chí trên cơ sở dữ liệu - một số phím sẽ được di chuyển nhiều hơn so với những người khác, làm cho giải pháp này đạt đến giới hạn sớm hơn. Tôi có thể giải quyết vấn đề này bằng cách định kỳ đánh số lại cơ sở dữ liệu, nhưng có vẻ như một cấu trúc dữ liệu tốt nên tránh việc này.
Cấu trúc khác mà tôi đã xem là danh sách được liên kết (và các biến thể). Điều này có lợi thế của việc sửa đổi đơn giản, nhưng tôi không chắc chắn về các thuộc tính của nó đối với SQL - thứ tự như một danh sách trong truy vấn SQL có vẻ như nó sẽ gây đau đớn, và giải nén một tập con không tuần tự của danh sách đặc tính truy xuất.
Ngoài ra, có B-Cây, nhiều cây nhị phân, v.v. Bạn đề xuất gì cho cấu trúc dữ liệu này? Có cấu trúc dữ liệu chuẩn cho giải pháp này trong SQL không? Ý tưởng ban đầu về việc đi với các số nguyên tuần tự thực sự có vấn đề mở rộng quy mô hay tôi gặp phải sự cố khi không có vấn đề gì?
Ném tiền thưởng vào đây vì số lượng câu trả lời thấp ... –
Xin chào Paul - tôi thấy bạn đã chấp nhận câu trả lời của tôi - cảm ơn: D. Bạn đã quyết định đi đến giải pháp được đề xuất nào và tại sao? – Matt