Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Piszesz zapytanie dziedziczące napisane w SQL przy użyciu sprzężenia wewnętrznego?

Jeśli patrzysz na hierarchię drzewa, to zagnieżdżony model zbioru działa całkiem dobrze, ale wiąże się z poważną zmianą w strukturze twojej tabeli dziedziczenia.

Jeśli wdrażasz arbitralnie skierowany wykres (na przykład masz profil „autora”, który może publikować artykuły, ale nie może moderować komentarzy, oraz profil „moderatora”, który może moderować komentarze, ale nie publikuje artykułów), możesz zajrzeć dla jakiegoś innego rozwiązania.

Jedną z możliwości jest rezygnacja z dziedziczenia i ręczne ustawienie uprawnień dla każdej grupy.

Inną możliwością jest użycie tabeli dziedziczenia do przechowywania zarówno bezpośredniego, jak i pośredniego dziedziczenia (to znaczy, że węzeł byłby powiązany ze wszystkimi jego dziećmi przy użyciu relacji „bezpośredniej”, a także ze wszystkimi jego potomkami przy użyciu relacji „pośredniej”). Ta strategia wymaga ponownego utworzenia wszystkich relacji pośrednich w tabeli za każdym razem, gdy zmienisz jedną z relacji bezpośrednich (można to zrobić za pomocą prostego INSERT SELECT ), ale ma tę zaletę, że dostęp do wszystkich potomków wymaga tylko jednego sprzężenia.

Podstawowa idea to:

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

Pętla na odległość powinna być wykonywana, dopóki nie będzie więcej dostępnych elementów odległości D-1, co można zrobić za pomocą zapytania wybierającego lub, jeśli masz, metainformacji o tym, ile wierszy zostało wstawionych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sql if w instrukcji insert bez select

  2. Dlaczego nie mogę wstawić do MySQL?

  3. MySQL:automatyczna inkrementacja tymczasowa kolumna w instrukcji select

  4. Tworzenie raportu w java z JDBC i próba konwersji między datą sql a datą util java

  5. Zapisywanie danych o stanie bota w mySQL za pomocą .NET