Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak to zoorganizować
Forum PHP.pl > Forum > Bazy danych > MySQL
krzychu.kukla
Jak poprawnie powinna wyglądać struktura bazy oraz co jest wydajniejsze.

Mamy kilka obiektów:
- User (zarejestrowany użytkownik)
- Order (zamówienie)
- Document (dokument, np. faktura)
- Person (osoba która może zostać użytkownikiem)
oraz
- Mail (wiadomość e-mail)

Wiadomość e-mail jest przypisana do co najmniej jednego obiektu z powyższych, ale może być do 2 lub dowolnej ilości równocześnie. Pytanie jak to powiązać? Rozwiązanie pierwsze:

  1. mails
  2. ----------------
  3. id PK INT
  4. user_id INT FK NULL
  5. order_id INT FK NULL
  6. document_id INT FK NULL
  7. person_id INT FK NULL
  8. sender VARCHAR
  9. recipient VARCHAR
  10. body TEXT


I teraz w przypadku gdy wiadomość jest powiązana z użytkownikiem to w user_id jest jakaś liczba ID użytkownika, a inne pola (order_id, document_id ...) mają NULL-a.

Nie wiem czy to jest dobre rozwiązania, i podświadomie czuje że chyba jednak nie. Zaznaczam że wszystko jest w InnoDB z kluczami obcymi. Tak samo chciałbym zostawić sobie furtkę w postaci możliwości rozbudowy bazy o nowe obiekty.

Drugie rozwiązanie:

  1. mails
  2. ---------------
  3. id PK INT
  4. sender VARCHAR
  5. recipient VARCHAR
  6. body TEXT


A do tego tabele wiążące:

  1. mails_users
  2. --------------
  3. mail_id FK INT
  4. user_id FK INT

  1. mails_orders
  2. --------------
  3. mail_id FK INT
  4. order_id FK INT

  1. mails_documents
  2. --------------
  3. mail_id FK INT
  4. document_id FK INT

  1. mails_persons
  2. --------------
  3. mail_id FK INT
  4. person_id FK INT


I teraz tworzymy poprostu rekord w mails oraz dodatkowo drugi rekord w odpowiedniej tabeli, żeby powiązać tą wiadomość np. z osobą, zamówieniem itd. Unikamy przez to stosowania pól NULL oraz oszczędzamy na miejscu w tabeli mails. Dodatkowo to rozwiązanie wydaje się być bardziej uniwersalne, bo dokładając dodatkowe tabele łączące można wiązać wiadomości z nowymi e-mailami (np. thread - wątek) itd.


Zapraszam do dyskusji smile.gif


Pozdrawiam
mawwro
rozwiązanie 2 lepsze pod względem uniwersalności
pod względem wydajności może być różnie (przy bardzo dużych bazach rozwiązanie 1 może być trochę wydajniejsze) ale trzeba by było to sprawdzić dokładnie
erix
Proszę o poprawienie tytułu na bardziej opisujący problem.
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.