Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Normalizacja bazy danych
Forum PHP.pl > Forum > Przedszkole
radabus
Męczę się nad (raczej banalnym) problemem z normalizacją bazy danych. Idea jest taka, że doszedłem już do poziomu, gdzie mam tabelę z akcjami, każda akcja ma jakąś kategorię. Kategorie mogą być 2 rodzajów: główne i podrzędne, użytkownicy sobie sami wymyślają kategorie i je dodają, usuwają, modyfikują.

Jako że jedna (sub)kategoria może przynależeć do wielu użytkowników, a jeden użytkownik może mieć wiele (sub)kategorii, to mam w tym przypadku relację wiele-do-wielu, myślałem więc utworzyć stworzyć 2 tabele, jedna dla kategorii, druga dla subkategorii, po czym sprząc je tabelą pomocniczą, jak to w relacjach wiele-do-wielu się niby robi.

I tu leży pies pogrzebany. Jeśli użytkownik Kowalski doda kategorię Abcd, która będzie mieć subkategorie Bcd oraz Bef, to może się przecież zdarzyć, że przyjdzie Nowak i doda sobie kategorię Xyz, która będzie miała subkategorie Uwx oraz Bcd - to w tym momencie wysypuje się idea, bo subkategoria Bcd ma 2 nadrzędne.

Wracając do początku mógłbym na upartego dać jedną tabelę dla kategorii i drugą dla subkategorii, w której będzie występowała redundancja, nazwy będą się powtarzać - wszystkie będą miały przypisanego jednego użytkownika i nie będzie zgrzytów, np. tak:

Kod
id nazwa użytkownik   kat_nadrzędna
1  Bcd   [Kowalski]  Abcd
2  Bef   [Kowalski]  Abcd
3  Uwx   [Nowak]     Xyz
4  Bef   [Nowak]     Xyz
5  Bef   [Dziura]    Lkj
...


Czy takie rozwiązanie ma sens z punktu widzenia normalizacji, czy też należy szukać wyjścia gdzie indziej?
Sephirus
Takie rozwiązanie jak sam napisałeś może cię nie satysfakcjonować. Pomyśl czy zależy Ci na tym by kilka kategorii może mieć subkategorie o tej samej nazwie.

Ja osobiście jestem za tabelami powiązań. Coś na styl 3 postaci normalnej (poruszając się w języku normalizacji b.d.) Zobacz

Jeżeli mamy trzy byty - kategoria, subkategoria, użytkownicy to mam 3 tabelki dla opisu tych elementów w których każda ma powiązanie z innymi.

tabela użytkowników nie ma żadnych powiązań,
kategorie mają powiązanie z użytkownikiem,
subkategorie mają powiązanie z użytkownikiem i kategorią.

Lub można to zawrzeć w dwóch tabelach gdzie eliminujemy subkategorie i wrzucamy to do kategorii z zaznaczeniem "ojcowskiej" kategorii. Ta opcja jest o tyle lepsza, że pozwala na więcej zagłębień niż tylko kategoria->subkategoria;

Zapis takiej struktury nie jest trudny, odczyt przy dobrym pomyśle też wink.gif Robi się z tego struktura drzewa, a jeżeli chcesz mocne rozwiązanie to poszukaj w necie o hierarchicznej strukturze drzewa w DB - tej z poziomem i elementem obok, nie umiałbym Ci tego wytłumaczyć smile.gif
radabus
Nadal jednak nie wiem jak rozwiązać problem, że dla jednego kategoria A będzie główną kategorią, dla drugiego będzie podkategorią B, a dla innego podkategorią C. Przy czym założenie jest takie, że każdy ma widzieć tylko swoje kategorie, a nie cudze. Ślepy jestem, że tego nie widzę czy jak? wink.gif
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.