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:
mails ---------------- id PK INT user_id INT FK NULL order_id INT FK NULL document_id INT FK NULL person_id INT FK NULL sender VARCHAR recipient VARCHAR 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:
mails --------------- id PK INT sender VARCHAR recipient VARCHAR body TEXT
A do tego tabele wiążące:
mails_users -------------- mail_id FK INT user_id FK INT
mails_orders -------------- mail_id FK INT order_id FK INT
mails_documents -------------- mail_id FK INT document_id FK INT
mails_persons -------------- mail_id FK INT 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

Pozdrawiam