Một nhu cầu phổ biến khi sử dụng cơ sở dữ liệu là truy cập các bản ghi theo thứ tự. Ví dụ: nếu tôi có một blog, tôi muốn có thể sắp xếp lại các bài đăng trên blog của mình theo thứ tự tùy ý. Các mục này thường có rất nhiều mối quan hệ, vì vậy một cơ sở dữ liệu quan hệ dường như có ý nghĩa.
Giải pháp phổ biến mà tôi đã thấy là thêm một cột số nguyên order
:
CREATE TABLE AS your_table (id, title, sort_order)
AS VALUES
(0, 'Lorem ipsum', 3),
(1, 'Dolor sit', 2),
(2, 'Amet, consect', 0),
(3, 'Elit fusce', 1);
Sau đó, chúng ta có thể sắp xếp các hàng bằng cách sắp xếp order
chúng theo thứ tự thích hợp.
Tuy nhiên, điều này có vẻ vụng về:
- Nếu tôi muốn di chuyển bản ghi 0 về đầu, tôi phải sắp xếp lại mọi bản ghi
- Nếu tôi muốn chèn một bản ghi mới vào giữa, tôi phải sắp xếp lại mọi bản ghi sau nó
- Nếu tôi muốn xóa một bản ghi, tôi phải sắp xếp lại mọi bản ghi sau nó
Thật dễ dàng để tưởng tượng một tình huống như:
- Hai hồ sơ có cùng
order
- Có những khoảng trống
order
giữa các hồ sơ
Những điều này có thể xảy ra khá dễ dàng vì một số lý do.
Đây là cách tiếp cận mà các ứng dụng như Joomla thực hiện:
Bạn có thể lập luận rằng giao diện ở đây rất tệ và thay vì con người trực tiếp chỉnh sửa số, họ nên sử dụng mũi tên hoặc kéo và thả xuống và bạn có thể đúng. Nhưng đằng sau hậu trường, điều tương tự đang xảy ra.
Một số người đã đề xuất sử dụng số thập phân để lưu trữ đơn hàng, để bạn có thể sử dụng "2.5" để chèn một bản ghi vào giữa các bản ghi ở thứ tự 2 và 3. Và trong khi điều đó giúp ích được một chút, thì thậm chí còn rắc rối hơn vì bạn có thể kết thúc bằng số thập phân kỳ lạ (bạn dừng ở đâu? 2,75? 2,875? 2,8125?)
Có cách nào tốt hơn để lưu trữ thứ tự trong một bảng?
orders
và ddl.