Couple điều cũng cần xem xét ...
1) Khi bạn nói "loại như reddit" dựa trên xếp hạng hoặc ngày, bạn có nghĩa là cấp cao nhất hoặc toàn bộ điều?
2) Khi bạn xóa nút, điều gì sẽ xảy ra với các nhánh? Bạn có tái bố mẹ họ không? Trong quá trình thực hiện, tôi nghĩ rằng các biên tập viên sẽ quyết định - hoặc là ẩn nút và hiển thị nó là "bình luận ẩn" cùng với các trẻ em có thể nhìn thấy, ẩn các bình luận và đó là trẻ em, hoặc nuke toàn bộ cây. Việc làm cha mẹ trở nên dễ dàng (chỉ cần đặt cha mẹ của con cái vào cha mẹ đã bị xóa), nhưng nó liên quan đến toàn bộ cây có vẻ phức tạp để thực hiện trong cơ sở dữ liệu.
Tôi đã xem xét mô-đun ltree cho PostgreSQL. Nó sẽ làm cho các hoạt động cơ sở dữ liệu liên quan đến các bộ phận của cây nhanh hơn một chút. Về cơ bản, điều này cho phép bạn thiết lập một trường trong bảng trông giống như:
ltreetest=# select path from test where path <@ 'Top.Science';
path
------------------------------------
Top.Science
Top.Science.Astronomy
Top.Science.Astronomy.Astrophysics
Top.Science.Astronomy.Cosmology
Tuy nhiên, nó không đảm bảo tính toàn vẹn tham chiếu. Nói cách khác, bạn có thể có một bản ghi cho "Top.Science.Astronomy" mà không có bản ghi cho "Top.Science" hoặc "Top". Nhưng những gì nó cho phép bạn làm là những thứ như:
-- hide the children of Top.Science
UPDATE test SET hide_me=true WHERE path @> 'Top.Science';
hoặc
-- nuke the cosmology branch
DELETE FROM test WHERE path @> 'Top.Science.Cosmology';
Nếu kết hợp với "comment_id" truyền thống/"PARENT_ID" cách tiếp cận sử dụng thủ tục lưu trữ, tôi nghĩ bạn có thể nhận tốt nhất của cả hai thế giới.Bạn có thể nhanh chóng duyệt cây nhận xét trong cơ sở dữ liệu bằng cách sử dụng "đường dẫn" của bạn và vẫn đảm bảo tính toàn vẹn tham chiếu qua "comment_id"/"parent_id". Tôi hình dung một cái gì đó như:
CREATE TABLE comments (
comment_id SERIAL PRIMARY KEY,
parent_comment_id int REFERENCES comments(comment_id) ON UPDATE CASCADE ON DELETE CASCADE,
thread_id int NOT NULL REFERENCES threads(thread_id) ON UPDATE CASCADE ON DELETE CASCADE,
path ltree NOT NULL,
comment_body text NOT NULL,
hide boolean not null default false
);
Chuỗi con đường cho một cái nhìn bình luận như được
<thread_id>.<parent_id_#1>.<parent_id_#2>.<parent_id_#3>.<my_comment_id>
Vì vậy, một lời nhận xét gốc rễ của chủ đề "102" với một comment_id "1" sẽ có một con đường của:
102.1
Và một đứa trẻ mà comment_id là "3" sẽ là:
102.1.3
Một số trẻ em của "3" có id của "31" và "54" sẽ là:
102.1.3.31
102.1.3.54
Để ẩn nút "3" và những đứa trẻ của mình, bạn muốn phát hành này :
UPDATE comments SET hide=true WHERE path @> '102.1.3';
Tôi không biết - điều này có thể làm tăng thêm chi phí không cần thiết. Thêm vào đó tôi không biết ltree được duy trì tốt như thế nào.
Bởi "trong bộ nhớ", bạn có ý nghĩa ở cấp ứng dụng không? – Ced