Sagen wir, ich habe drei Tabellen. Ich werde diese Tabellen so einfach wie möglich machen, das Design Frage erläutern:Was ist die beste Vorgehensweise beim Entwerfen einer SQL-Tabelle, die sich auf Tabelle A, Tabelle B oder Tabelle A und B bezieht?
Benutzer:
CREATE TABLE users (user_id INT PRIMARY KEY);
Networks:
CREATE TABLE networks (network_id INT PRIMARY KEY);
Netzwerk-Benutzer:
CREATE TABLE network_users (
network_id INT,
user_id INT,
PRIMARY KEY(network_id, user_id),
FOREIGN KEY(network_id) REFERENCES networks(network_id),
FOREIGN KEY(user_id) REFERENCES users(user_id)
);
Wie oben gezeigt, haben Benutzer eine Beziehung zwischen vielen und vielen Netzwerken, wie in der Tabelle Netzwerkbenutzer beschrieben. Das ist alles ziemlich konventionell.
Jetzt ist hier meine Frage:
Lassen Sie uns sagen, dass ich eine Nachrichten-Tabelle hinzufügen möchten, und ich möchte in der Lage sein, eine Nachricht zu speichern verschickt an:
- einen bestimmten Benutzer,
- eine spezifische Netzwerk,
- oder einen Benutzer in einem Netzwerk
Was ist der beste Design-Ansatz für den messag ist es Tisch?
Ich könnte eine Nachricht Tabelle wie folgt strukturiert:
CREATE TABLE messages (
message_id INT PRIMARY KEY,
network_id INT,
user_id INT,
FOREIGN KEY(network_id) REFERENCES networks(network_id),
FOREIGN KEY(user_id) REFERENCES users(user_id)
);
wo:
- Nachrichten an einen bestimmten Benutzer das user_id Feldset und NULL für das network_id Feld
- Nachrichten gesendet haben gesendet In einem bestimmten Netzwerk ist das Feld network_id gesetzt und NULL für die Benutzer-ID
- Nachrichten, die an einen Benutzer innerhalb eines Netzwerks gesendet werden, haben sowohl die Netzwerk-ID als auch uns er_id Felder gesetzt
Aber ist das der beste Ansatz? Da die Felder network_id und user_id null sein können, muss ich einen separaten Primärschlüssel (message_id) erstellen, im Gegensatz zur Verwendung eines zusammengesetzten Primärschlüssels (von network_id und user_id), wie es sonst der Fall wäre.
Wenn sich Benutzer A im Netzwerk N von Benutzer A im Netzwerk O (Senden einer Nachricht an einen bestimmten Benutzer in einem bestimmten Netzwerk) unterscheidet, befinden sich Benutzer und Netzwerke nicht in einer Viele-zu-Viele-Beziehung, sondern nur in einer Eins. zu viele. – Shadow
Hm, kannst du das weiter erklären? Ein Benutzer kann sich in mehreren Netzwerken befinden und ein Netzwerk kann mehrere Benutzer enthalten. Ist das nicht eine viel zu viele Beziehung zwischen Netzwerken und Benutzern? Nachrichtenbeziehung Nr. 3 einer Nachricht an einen Benutzer innerhalb eines Netzwerks wäre eine Eins-zu-Viele-Beziehung, aber das ist eine Eins-zu-viele-Beziehung zwischen Nachrichten und Netzwerkbenutzern; Ich würde denken, dass die Beziehung messages-to-network_users die Beziehung zwischen Benutzern und Netzwerken nicht beeinflusst. – VKK
Wenn sich derselbe Benutzer in mehreren Netzwerken befinden kann, ist es sinnlos, eine Nachricht an einen bestimmten Benutzer in einem bestimmten Netzwerk zu senden. Ich muss nur die Nachricht an den Benutzer senden. – Shadow