2013-06-27 16 views
9

Ich möchte ein Web-Messaging-System wie Facebook haben. Ich denke schon an viele Alternativen für die Datenbankstruktur, bin mir aber nicht sicher, welches die beste Vorgehensweise dafür ist. Ich habe hier zwei Alternativen, die erste verwendet zwei Tabellen, die zweite verwendet drei Tabellen, aber einen Zyklus in ERD.Datenbankstruktur für Web Messaging System

First: Zwei Tabelle, wo die Nachrichtentabelle

user 
---------- 
id 
name 

message 
-------------- 
id 
from_id 
to_id 
message_id --> refer to this table itself, to make me know which message is the topic 
subject 
content 
time 
status --> inbox, outbox, archive 
read --> read, unread 

Zweite auf sich selbst verweisen: Drei Tabelle, sondern einen Zyklus in erd

user 
---------- 
id 
name 

message_header 
-------------- 
id 
from_id 
to_id 
subject 
status --> inbox, outbox, archive 
time 

message 
-------- 
id 
message_header_id 
content 
time 
read --> read, unread 
author_id 

persönlich machen, ich mag diese Struktur, weil es verwende nur einen Nachrichtenkopf und viele Nachrichten (Inhalt). Die author_id selbst kann nicht entfernt werden, weil ich sie wissen muss, ob sich die Nachricht auf der linken Seite (als Absender) oder auf der rechten Seite (als Empfänger) befindet. Dieses System ist nur für Zwei-Personen-Messaging-System.

Grundsätzlich sind diese beiden Tabellen identisch, aber welches ist die beste Vorgehensweise, um dieses Messaging System zu implementieren? Danke schonmal.

Antwort

12

Nach dem Lernen auf die harte Tour (vor Zeiten, während meines letzten Projekts ...), kann ich Ihnen empfehlen, die Dinge zu trennen und zu organisieren, wann immer es möglich ist. Selbst-Beziehung ist eine nette Sache, nicht in der Nähe zu sein, wenn möglich (es gibt seltene Ausnahmen). Entwerfen Sie Ihre Klassen in der ersten Instanz; baue dann eine Datenbank auf, in der Dinge gut passen, aber die Dinge einfach so halten, wie sie sein sollten. Meine Präferenz ist ... besser als gezogenem sagte

Diagram


Sie bevorzugen, den Code zu sehen. Es ist here.
Eine mögliche Abfrage von Nachrichten aus einem bestimmten Header zur Liste

SELECT 
    h.id AS `header_id`, h.`subject`, h.`status`, 
    m.id AS `message_id`, m.content, m.`time`, 
    IF(m.is_from_sender, x.`name`, y.`name`) AS `written_by` 
FROM (SELECT * FROM header WHERE id = @VAR) h 
    INNER JOIN message m ON (h.id = m.header_id) 
    INNER JOIN user x ON (h.from_id = x.id) 
    INNER JOIN user y ON (h.to_id = y.id); 
  • Sie erhalten eine persönliche Vorliebe von mir Bitfelder zu sehen sein würde. Zum Beispiel müssen Sie sich an eine bestimmte from_id nicht mehr als einmal erinnern, sobald Ihr Zweck ein Zwei-Personen-Nachrichtensystem ist.
  • Ich hoffe, Sie haben Zweifel.

Grüße,

Leonardo

+0

Sollte die Nachricht im Auftrag der Antwort auf eine bestimmte Nachricht verkettet werden oder sollten sie als pro-Zeitstempel – aeonsleo

+0

Mit Antwort um (höhere ids zuerst) kann ein wenig sein aufgeführt werden billiger, aber Sie können Timestamp Bestellung (natürlich, mit einem geeigneten Index) mehr freundlich im Fall, sagen wir, jemand antwortet ohne Internet und es braucht etwas Zeit, um die Nachricht effektiv an die Datenbank zu senden. Das heißt, Sie entscheiden:> –

+0

Was ist das Attribut "is_from_sender"? –

Verwandte Themen