Nếu bạn đang xem xét phân cấp cây, thì mô hình tập hợp lồng nhau hoạt động khá tốt, nhưng liên quan đến sự thay đổi lớn trong cấu trúc bảng kế thừa của bạn.
Nếu bạn đang triển khai một biểu đồ có hướng tùy ý (ví dụ:bạn có hồ sơ "tác giả" có thể xuất bản bài viết nhưng không kiểm duyệt nhận xét và hồ sơ "người kiểm duyệt" có thể kiểm duyệt nhận xét nhưng không xuất bản bài viết), bạn có thể muốn xem cho một số giải pháp khác.
Một khả năng là từ bỏ tính kế thừa và thiết lập các quyền theo cách thủ công cho mọi nhóm.
Một khả năng khác là sử dụng bảng kế thừa để lưu trữ cả thừa kế trực tiếp và gián tiếp (nghĩa là, một nút sẽ có liên quan đến tất cả các nút con của nó bằng cách sử dụng mối quan hệ "trực tiếp", cũng như tất cả các nút con của nó bằng cách sử dụng mối quan hệ "gián tiếp"). Chiến lược này yêu cầu bạn tạo lại tất cả các mối quan hệ gián tiếp trong bảng bất cứ khi nào bạn thay đổi một trong các mối quan hệ trực tiếp (điều này có thể được thực hiện bằng cách sử dụng INSERT SELECT
đơn giản ), nhưng có ưu điểm là chỉ yêu cầu một phép nối duy nhất để truy cập tất cả các phần tử con.
Ý tưởng cơ bản là:
CREATE TABLE group_inherit (
parent INT NOT NULL,
child INT NOT NULL,
distance INT NOT NULL,
PRIMARY KEY (parent,child)
);
/* Clean up indirect relations */
DELETE FROM group_inherit WHERE distance <> 0;
/* Repeat this for each D > 0 until the maximum distance is reached */
INSERT IGNORE INTO (parent, child, distance)
SELECT fst.parent, snd.child, D
FROM group_inherit fst
INNER JOIN group_inherit snd ON snd.parent = fst.child
WHERE fst.distance = 0 AND snd.distance = D - 1;
/* Select all permissions for a user type */
SELECT perm.*
FROM group_permissions perm
INNER JOIN group_inherit ON perm.moderator = child
WHERE parent = ?
Vòng lặp về khoảng cách nên được thực hiện cho đến khi không còn phần tử nào của khoảng cách D-1 nữa, điều này có thể được thực hiện bằng cách sử dụng một truy vấn chọn hoặc, nếu bạn có, siêu thông tin về số lượng dòng đã được chèn.