sql >> Database teknologi >  >> RDS >> Mysql

Skriver du en arveforespørgsel skrevet i SQL ved hjælp af en indre joinforbindelse?

Hvis du ser på et træhierarki, så fungerer den indlejrede sætmodel ret godt, men involverer en større ændring i strukturen af ​​din arvetabel.

Hvis du implementerer en vilkårlig rettet graf (du har f.eks. en "forfatter"-profil, der kan udgive artikler, men ikke moderere kommentarer, og en "moderator"-profil, der kan moderere kommentarer, men ikke udgive artikler), vil du måske se for en anden løsning.

En mulighed er at give afkald på arv og manuelt indstille tilladelserne for hver gruppe.

En anden mulighed er at bruge arvetabellen til at gemme både direkte og indirekte arv (det vil sige, at en node vil være relateret til alle dens børn ved hjælp af en "direkte" relation, såvel som alle dens efterkommere ved hjælp af en "indirekte" relation). Denne strategi kræver, at du genskaber alle de indirekte relationer i tabellen, hver gang du ændrer en af ​​de direkte relationer (dette kan gøres ved at bruge en simpel INSERT SELECT ), men har den fordel, at det kun kræver en enkelt joinforbindelse for at få adgang til alle efterkommere.

Den grundlæggende idé er:

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 = ?

Sløjfen på afstand skal udføres, indtil der ikke er flere elementer af afstand D-1 tilgængelige, hvilket kan gøres ved hjælp af en select-forespørgsel eller, hvis du har det, meta-information om, hvor mange linjer der blev indsat.



  1. MySQL LOAD DATA INFIL med komma som decimalseparator

  2. SQL, mangler ende, men hvorfor?

  3. ODBC-skalarfunktioner for dato og klokkeslæt i SQL Server (T-SQL-eksempler)

  4. Sådan rettes "ALTER TABLE SWITCH statement failed" Msg 4982 (SQL Server)