2013-02-27 29 views
10

Vì vậy, tôi có một bảng yêu thích của người dùng. Có vài triệu hàng trong số đó.Cách hiệu quả để lưu trữ các mục có thể sắp xếp lại trong cơ sở dữ liệu

Hiện tại, chúng chỉ có ba cột: id (pk), userIdsomeFkRef. Có một chỉ mục trên userId để cho phép tôi chọn các mục ưa thích của người dùng một cách nhanh chóng.

Hiện tại, các đơn đặt hàng này được đặt hàng theo số id chỉ hiệu quả là thứ tự chèn. Chúng tôi muốn cung cấp cho người dùng cơ hội để sắp xếp lại các mục yêu thích của họ, rất có thể thông qua một số loại tương tác kéo và thả.

Cách tiếp cận đầu tiên (và tôi nghi ngờ ngây thơ) của tôi là chỉ cần thêm một cột order và chỉ mục tổng hợp trên userId, order. Tuy nhiên, khi phản ánh, khi người dùng di chuyển mục của họ một khoảng cách nào đó trong danh sách, tất cả các hàng trung gian giữa vị trí bắt đầu của mục và vị trí kết thúc sẽ cần cột order được tính toán lại và do đó, chỉ mục cũng vậy.

Điều này rất có thể xảy ra.

Trước khi tôi dành thời gian để định lượng chính xác mức độ xấu, tôi tự hỏi liệu có một biểu diễn dựa trên bảng tốt hơn để thao tác với các loại hoạt động tôi mô tả ở trên không.

+0

Tôi không thuyết phục bạn cần lập chỉ mục trường mới. –

+0

Nói chung, lệnh 'order by' yêu cầu chỉ mục, phải không? – spender

+0

@spender Yêu cầu không, nhưng nếu các hàng trong bảng của bạn lớn và bạn nhận được một tập hợp kết quả lớn, sắp xếp bằng cách sử dụng một chỉ mục có thể tạo ra khá ít I/O. –

Trả lời

3

Nếu bạn không cần thao tác với một số người dùng trên một số người dùng, bạn có thể chỉ có một bản ghi cho mỗi người dùng, với danh sách được sắp xếp của someFkRef (refA , refB).

Nhưng đó là một hình thức bỏ bình thường, và vì nó có một số nhược điểm, nó thực sự phụ thuộc vào nhu cầu của bạn (và nhu cầu tương lai của bạn, đó là nơi xuất phát những rắc rối)

+0

Đúng, không chuẩn hóa sẽ đánh bạn ngay cả khi cùng một người dùng: a) bạn cần 'giới hạn/bù đắp' và thao tác một danh sách lớn; b) những dữ liệu đó được chuyển qua internet và người dùng sắp xếp danh sách hàng trăm thành phần một cách nhanh chóng (xin chào, O (N), trễ và không đồng bộ hóa). Sự bất bình thường là một nỗi đau lớn và không ai muốn làm điều đó. –

6

Đối với một kéo và thả tương tác, đặt cược tốt hơn là ưu tiên. Bạn sẽ bắt đầu với các ưu tiên là 1, 2, 3, v.v., giống như một thứ tự sắp xếp.

Nhưng sau đó, người dùng muốn di chuyển mục 5 từ 1 đến 2. Thì đấy! Đặt giá trị 1.5. Không có giá trị nào khác cần phải thay đổi. Bản cập nhật chỉ mục sẽ xử lý phần còn lại.

Để làm việc này, mức độ ưu tiên cần được lưu trữ dưới dạng số dấu phẩy động. Đó có thể là một vấn đề. Ngoài ra, một số lượng lớn các thay đổi có thể dẫn đến việc đẩy các giới hạn của dấu phẩy động. Vì vậy, nếu người dùng cố gắng lấy phần tử cuối cùng và chèn nó vào giữa hai phần tử đầu tiên, người đó có thể lấy đi nó khoảng vài chục lần.

Bạn có thể khắc phục điều này với một quá trình định kỳ reassigns số cho một (hoặc tất cả người dùng, nếu trong hàng loạt) bắt đầu từ 1.

+0

Đây cũng là một cách tiếp cận có giá trị. Nhưng bạn vẫn cần phải có một chỉ số trên cột someFkRef, do đó, nó vẫn sẽ là một chút tiêu thụ là bảng là rất lớn. –

+1

@SamuelEUSTACHI Index không phải là phần tồi tệ nhất. Phần tồi tệ nhất là các số dấu phẩy động có độ chính xác hữu hạn và sau một số 53 chuyển động được thiết kế tốt, người ta có thể phá vỡ logic đặt hàng. Có, bạn luôn có thể có bộ đếm và kích hoạt để chuẩn hóa lại danh sách này, nhưng tôi không chắc liệu nó có phải là giải pháp hiệu quả hơn chút nào hay không. –

1

Không chắc gì tài liệu tham khảo phụ thuộc của bạn có thể đến trường ID, nhưng có bạn nghĩ về việc viết quá mức không? Tôi nghĩ rằng có một SET IDENTITY INSERT = ON, hoặc một số như vậy mà bạn có thể làm.

Tôi nhận thấy đây là một điều kỳ lạ để đề xuất, nhưng xem xét những gì bạn đang cố gắng làm, nó có thể có ý nghĩa, adn gây ra số tiền ít nhất của chi phí.

+0

@Joachim - Số lượng ghi lại số đo = 2 - chỉ dành cho nhà tài trợ và người nhận. Reindex là không xác định - có lẽ anh ta đã tích hợp sẵn một số đệm, và với hàng triệu bản ghi, có lẽ là tái lập chỉ mục ngoài giờ cao điểm. – Chains

Các vấn đề liên quan