Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Porównanie dwóch projektów baz danych dla wiadomości wewnętrznych

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Następna najbliższa data i godzina w MySQL

  2. Kod błędu MySQL:1411. Nieprawidłowa wartość daty i godziny:„” dla funkcji str_to_date

  3. mysql zapytanie PHP:chcę, aby określone elementy były najpierw, a następnie posortować resztę elementów

  4. Indeks MySQL dla grupowania według / zamawiania według

  5. Różnice w ciągach PHP i ograniczenia dynamiczne