Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Relacja dla trzech tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
jg44
Witam,
napisałem prosty skrypt przesyłania prywatnych wiadomości między użytkownikami na portalu i chciałbym jeszcze dodać opcję, aby administrator również mógł wysłać użytkownikowi wiadomość. Mam następujące trzy tabele (wypisałem tylko istotne dla problemu kolumny): `uzytkownicy`(`ID`,`nazwa_uzytkownika`, ...), `wiadomosci`(`ID`,`od`,`do`, ...) oraz `admin`(`ID`,`nazwa`). Tabele `uzytkownicy` oraz `wiadomosci` powiązane są następującymi relacjami:
  1. FOREIGN KEY(`od`) REFERENCES `uzytkownicy`(`ID`),
  2. FOREIGN KEY(`do`) REFERENCES `uzytkownicy`(`ID`)

W tabeli `wiadomosci` w kolumnie `od` jest przechowywane ID autora wiadomości, w kolumnie `do` - adresata. Przesyłanie wiadomości między użytkownikami działa. Jak zrobić relację, aby admin mógł wysłać wiadomość? Jeśli zrobię coś takiego:
  1. FOREIGN KEY(`od`) REFERENCES `admin`(`ID`),

to oczywiście jest źle:
Kod
Cannot add or update a child row: a foreign key constraint fails (`portal-5`.`wiadomosci`, CONSTRAINT `wiadomosci_ibfk_1` FOREIGN KEY (`od`) REFERENCES `uzytkownicy` (`ID`))

Najprostszym działającym rozwiązaniem byłoby zlikwidowanie tabeli `admin` i wrzucenie danych admina między zwykłych użytkowników, ale nie jest to zbyt profesjonalne...
Z góry dziękuję za pomoc.
pmir13
Dlaczego uważasz trzymanie oddzielnej tabeli admin za profesjonalne? Jakież to cechy posiadają admini, które wymagałyby innych kolumn niż zwykli użytkownicy oprócz samego faktu posiadania większych uprawnień? Ich adresy e-mail są bardziej? Mogą mieć więcej nazwisk? Po prostu dodaj do tabeli użytkownicy kolumnę stwierdzającą poziom uprawnień i tyle. Co by było gdybyś chciał kogoś awansować na admina lub zdegradować? Musiałbyś przenosić dane, martwiąc się o wszystkie możliwe relacje a tak tylko zmienisz jedno pole i nic nie musisz sprawdzać. Profesjonalizm nie polega na komplikowaniu sobie życia. Być może mając miliony użytkowników i kilku adminów miałoby by to jakieś uzasadnienie w celu przyspieszenia operacji dotyczących wyłącznie adminów, ale to mocno naciągane.
Ewentualnie gdyby jedna osoba mogła mieć wiele różnych uprawnień dotyczących różnych działów i to w ilości z góry nieokreślonej, wtedy jednak należałoby utworzyć raczej tabelę uprawnienia i powiązać z użytkownikami, ale wtedy i tak nic by to nie zmieniło względem nadawców i odbiorców wiadomości, którymi wciąż byliby użytkownicy. Dlatego zapisywanie uprawnień w tabeli użytkownicy jest jak najbardziej profesjonalne. Zresztą obejrzyj sobie strukturę bazy mysql, jeśli ona nie jest profesjonalna to nie wiem co jest.
jg44
No ok, może rzeczywiście z tym 'profesjonalizmem' to za dużo powiedziane, ale chodzi mi też o sam fakt, jakby mogła taka relacja wyglądać - teraz chodzi tylko o admina, następnym razem może być pozornie zupełnie inna sytuacja, która będzie wymagała podobnego rozwiązania... smile.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.