sql >> Database teknologi >  >> RDS >> Mysql

Sammenligning af to db-designs til intern messaging

Styrker ved den første

Det første skema adlyder bedre normaliseringsregler, og det er sandsynligvis bedre i de fleste tilfælde.

At have et thread_id , som dybest set er en naturlig nøgle, der ikke er en FK til et andet bord, beder sandsynligvis om problemer. Det vil være meget svært at håndhæve, at det er unikt, når du ønsker det, og det samme, når du ønsker det. Af denne grund vil jeg opfordre til det første foreslåede skema.

Styrker af anden

Dit andet skema gør det muligt at ændre emnet for hver besked i tråden. Hvis dette er en funktion, du ønsker, kan du ikke bruge den første mulighed, som du har skrevet den (men se nedenfor).

Andre muligheder

Message
    - id
    - parent (fk to Message.id)
    - subject
    - content
    - timestamp
    - sender (fk)

MessageRecipient
    - message_id (fk)
    - recipient (fk)
    - status (read, unread, deleted)

I stedet for at have et thread_id koncept, kan du intead have en parent koncept. Så vil hvert svar pege på den oprindelige beskeds registrering. Dette tillader trådning uden en 'tråd'-tabel. En anden mulig fordel ved dette er, at det tillader trådtræer såvel. Kort sagt kan du repræsentere meget mere komplicerede forhold mellem beskeder og svar på denne måde. Hvis du er ligeglad med det, så vil dette ikke være en bonus for din ansøgning.

Hvis du er ligeglad med de trådningsfordele, jeg lige har nævnt, vil jeg nok anbefale en hybrid af dine to skemaer:

MessageThread(models.Model):
    - id

Message(models.Model):
    - thread (pk)
    - subject
    - content
    - timestamp
    - sender

MessageRecipient
    - message_id (pk)
    - recipient (pk)
    - status (read, unread, deleted)

Dette ligner det første skema, bortset fra at jeg flyttede 'emne'-kolonnen fra MessageThread til Message tabel, for at tillade emnet at ændre sig, efterhånden som tråden skrider frem... Jeg bruger simpelthen MessageThread-tabellen til at fungere som en begrænsning på tråd-id'et, der bruges i Message (som overvinder de begrænsninger, jeg nævnte i begyndelsen af ​​mit svar). Du har muligvis også yderligere metadata, som du vil inkludere i MessageThread-tabellen, men det overlader jeg til dig og din ansøgning.



  1. android fjerndatabaseforbindelse problemer

  2. Sådan rettes "Den tilknyttede partitionsfunktion genererer flere partitioner, end der er filgrupper nævnt i skemaet" Msg 7707 i SQL Server

  3. Sådan migrerer jeg mine tabeller fra min asp.net-kerneapp på linux

  4. Denne PDO-forberedte erklæring returnerer falsk, men giver ikke en fejl