Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Relacja dla trzech tabel
jg44
post 30.12.2011, 13:39:24
Post #1





Grupa: Zarejestrowani
Postów: 122
Pomógł: 14
Dołączył: 14.07.2011
Skąd: Gliwice / Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
pmir13
post 30.12.2011, 14:49:14
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
jg44
post 30.12.2011, 14:53:36
Post #3





Grupa: Zarejestrowani
Postów: 122
Pomógł: 14
Dołączył: 14.07.2011
Skąd: Gliwice / Wrocław

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 12:02