sql >> Databáze >  >> RDS >> Mysql

Psaní dotazu na dědičnost napsaného v SQL pomocí vnitřního spojení?

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.



  1. Funkce Oracle Analytic - resetování klauzule pro vytváření oken

  2. UPDATE/DELETE v mysql a získat seznam dotčených ID řádků?

  3. Import SSIS Excel Vynucení nesprávného typu sloupce

  4. Chyba MySql se vyskytuje přes noc - Poslední paket odeslaný na server byl před 0 ms