Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: users/groups rekursywnie
Forum PHP.pl > Forum > Bazy danych
jacekplacek123
tabela users
  1. id
  2. ...

tabela groups
  1. id
  2. ...

tabela przypisań
  1. g_id
  2. group_id NULL
  3. user_id NULL

g_id - grupa do której przypisujemy albo usera, albo inną grupę
1, NULL, 6 - przypisanie usera o id 6 do grupy o id 1
2, 1, NULL - przypisanie grupy o id 1 do grupy o id 2
Teraz user 6 należy do grupy 1 oraz 2 (do grupy 2 poprzed przypisanie grupy 1->2)

W skrajnym przypadku może być tak, że user będzie należał do kilkudziesięciu grup, a te grupy do kolejnych grup, kolejne do kolejnych i tak dalej.
Potrzebuję wyciągnąć wszystkie grupy do których należy user (łącznie z tymi, do których należy poprzez przysanie grup do innych grup)
Schemat musi być w miarę uniwersalny - nie może wykorzystywać rozwiązań dostępnych tylko w jednym systemie DB
Wolałbym uniknąć dodatkowej tabeli pomocniczej, w której trzymałbym przypisania user -> grupa, czyli w podanym wyżej przypadku
6, 1
6, 2

Jakieś pomysły jak to rozwiązać?
Szukam albo odpowiedniego zapytania (oczywiście nie, że wyciągamy najpierw pierwszy level przypisań, potem kolejny i kolejny, każdy osobnym zapytaniem, bo to będzie zabójcze)
albo jakiegoś pomysłu, jak przebudować strukturę bazy, żeby łatwo można było to wyciągnąć
gothye
Miałem wcześniej podobny problem z hierarchią grup w tworzeniu uprawnień ACL z możliwością dziedziczenia uprawnień z rodzica ,rozwiązanie idealnym okazało się zastosowanie drzewa MPTT , gdzie za pomocą jednego zapytania jestem wstanie wyciągnąć uprawnienia ,i przynależność do grup użytkownika
by_ikar
Tabela pomocnicza jest moim zdaniem najłatwiejszym wyjściem. A taką tabelę pomocniczą łączysz z tabelą grup za pomocą join'a. A join to nie jest wymysł mysql, czy jakiejś innej bazy danych, tylko jest to klauzula języka sql. Jeżeli jakaś baza implementuje język sql (mysql, sqlite, mssql, pgsql, orcale itp), to będzie taki join działał w takiej bazie.

Sam z takiego rozwiązania korzystam, zarówno na sqlite, jak i na mysql.
jacekplacek123
gothye,
takiego rozwiązania używam w innych miejscach, ale albo coś przegabiłem, albo tutaj tego nie da się zastosować.
W moim przykładzie grupa może mieć kilku rodziców, a to chyba wyklucza MPTT

by_ikar,
w ostateczności coś takiego zastosuję, ale szukam czegoś na wzór MPTT z tą różnicą, że element może mieć kilku rodziców
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.