Pokud se díváte na stromovou hierarchii, pak model vnořené množiny funguje docela dobře, ale zahrnuje velkou změnu ve struktuře vaší dědičné tabulky.
Pokud implementujete libovolný orientovaný graf (máte například profil „autor“, který může publikovat články, ale nemoderuje komentáře, a profil „moderátora“, který může moderovat komentáře, ale nepublikovat články), možná budete chtít pro nějaké jiné řešení.
Jednou z možností je vzdát se dědičnosti a ručně nastavit oprávnění pro každou skupinu.
Další možností je použít tabulku dědičnosti k uložení přímé i nepřímé dědičnosti (to znamená, že uzel by byl příbuzný všem svým potomkům pomocí „přímého“ vztahu a také všem jeho potomkům pomocí „nepřímého“ vztahu). Tato strategie vyžaduje, abyste znovu vytvořili všechny nepřímé vztahy v tabulce, kdykoli změníte jeden z přímých vztahů (to lze provést pomocí jednoduchého INSERT SELECT
), ale má tu výhodu, že pro přístup ke všem potomkům vyžaduje pouze jediné spojení.
Základní myšlenka je:
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 = ?
Smyčka na vzdálenost by se měla provádět, dokud nebudou k dispozici žádné další prvky vzdálenosti D-1, což lze provést pomocí výběrového dotazu nebo, pokud máte, metainformací o tom, kolik řádků bylo vloženo.