2 Stimmen

Wie sollte ich mein Datenbankschema für ein Nachrichtensystem mit Anhängen einrichten?

Ich arbeite an der Erstellung eines Nachrichtensystems als Lieblingsprojekt, das die Möglichkeit von Dateianhängen beinhalten wird. Dies wird auf einer Website von mir für das interne Nachrichtensystem verwendet werden.

Eines der Merkmale dieses Systems ist, dass ich die MD5-Prüfsumme jeder hochgeladenen Datei beibehalten möchte, so dass, wenn doppelte Dateien hochgeladen werden, die beiden Links auf dieselbe Datei verweisen.

Bislang habe ich mir Folgendes ausgedacht:

Message
----------
MessageID (PK)  
SenderID (FK)  
RecipientsID (FK)  
AttachmentsID (FK)  
Subject  
MessageText  
DateSent  

Recipient  
----------  
UserID (FK)  
MessageID (FK)  

Attachment  
----------  
ID
Name
MessageID (FK)
FileID (FK)

File  
----------
ID
Checksum
LastAccessDate
AccessCount

Sie können also mehrere Nachrichten verfassen, von denen jede mehrere Anhänge enthalten kann. Aber auch, um Platz auf unserem Server zu sparen, da in meinem Anwendungsfall viele Benutzer dieselbe Datei hochladen werden, können verschiedene Anhänge auf dieselbe Datei verweisen.

Meine Frage ist, sollte die Nachrichtentabelle eine Art von RecipientsID enthalten? Oder reicht es aus, wenn meine Empfängertabelle auf die MessageID verweist?

Die gleiche Frage stellt sich für AttachmentsID in der Tabelle Message. Sollte ich eine Art von AttachmentsID haben? Oder reicht es aus, dass die Tabelle Attachment auf die MessageID verweist.

Ist es in Ordnung, wenn eine Nachricht keinen Bezug zu ihren Anhängen oder Empfängern hat, wenn sowohl Anhänge als auch Empfänger wissen, zu welcher Nachricht sie gehören? Oder sollte ich es anders machen?

Ich bin neugierig zu hören, wie erfahrene SQL-Experten dieses Schema aufbauen würden.


Bearbeiten: Ich möchte mehrere Empfänger und mehrere Anhänge pro Nachricht haben. Es tut mir leid, wenn das nicht klar war.

Gerade bei diesen eins-zu-vielen-Beziehungen habe ich Schwierigkeiten zu verstehen, ob ich es richtig mache.

0voto

James Punkte 3802
Message
---------
msg_id (PK)
sender_id (FK to users_id)
metadata...

Users
---------
user_id (PK)
address (How to locate the user for routing purposes)
metadata....

Attachments
----------
attachment_id (PK)
md5 (possibly UNIQUE, but beware of collisions)
file_sys_ref (a way to find the attachment file in the file system)
meta_data...

Recipients
----------
message_id (FK -> Messages)
user_id (FK -> Users)
meta_data...
PRIMARY KEY (message_id, user_id)

Ich würde die Datei im Dateisystem und nicht als BLOB in der Datenbank speichern, aber das ist nur meine Meinung. Ich finde, dass es einfacher ist, es durch einen externen Dateiübertragungsmechanismus (ftp, scp, HTTP POST, etc...) zu übertragen, dann schreiben Sie Ihre eigenen, um es in die Datenbank zu chunk.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X