Moc pierwszego
Pierwszy schemat podlega lepszym regułom normalizacji, a więc prawdopodobnie jest lepszy w większości przypadków.
Posiadanie thread_id
, który jest w zasadzie naturalnym kluczem, który nie jest FK do innego stołu, prawdopodobnie prosi o kłopoty. Bardzo trudno będzie wyegzekwować, że jest wyjątkowy, kiedy chcesz, aby był, i tak samo, gdy chcesz, aby był. Z tego powodu zachęcam do pierwszego sugerowanego schematu.
Siła sekundy
Twój drugi schemat umożliwia zmianę tematu dla każdej wiadomości w wątku. Jeśli jest to funkcja, której potrzebujesz, nie możesz użyć pierwszej opcji, tak jak ją napisałeś (ale zobacz poniżej).
Inne opcje
Message
- id
- parent (fk to Message.id)
- subject
- content
- timestamp
- sender (fk)
MessageRecipient
- message_id (fk)
- recipient (fk)
- status (read, unread, deleted)
Zamiast posiadania thread_id
koncepcja, możesz mieć parent
pojęcie. Wtedy każda odpowiedź będzie wskazywać na oryginalny zapis wiadomości. Pozwala to na gwintowanie bez tabeli „wątków”. Kolejną możliwą zaletą jest to, że umożliwia drzew wątków również. Mówiąc najprościej, możesz w ten sposób przedstawić znacznie bardziej skomplikowane relacje między wiadomościami i odpowiedziami. Jeśli ci to nie zależy, nie będzie to bonus za twoją aplikację.
Jeśli nie zależy Ci na wspomnianych przeze mnie zaletach wątkowania, prawdopodobnie poleciłbym hybrydę Twoich dwóch schematów:
MessageThread(models.Model):
- id
Message(models.Model):
- thread (pk)
- subject
- content
- timestamp
- sender
MessageRecipient
- message_id (pk)
- recipient (pk)
- status (read, unread, deleted)
Jest to podobne do pierwszego schematu, z wyjątkiem tego, że przeniosłem kolumnę „temat” z MessageThread
do Message
tabeli, aby zezwolić na zmianę tematu w miarę postępu wątku... Używam po prostu tabeli MessageThread, aby działać jako ograniczenie identyfikatora wątku używanego w Message (co przezwycięża ograniczenia, o których wspomniałem na początku mojej odpowiedzi). Możesz mieć dodatkowe metadane, które chcesz uwzględnić w tabeli MessageThread, ale pozostawiam to Tobie i Twojej aplikacji.