SQL - Wie man „einfache Beziehungen“ im Auge behält
-
26-10-2019 - |
Frage
Ich hoffe, jemand kann meinen Titel bearbeiten, um besser zu beschreiben, was ich meine, weil ich nicht genau weiß, wie dies genannt würde. Betrachten Sie jedoch dieses Setup: Ich möchte ein Benachrichtigungssystem erstellen, bei dem eine Nachricht einem Benutzer angezeigt wird, bis er auf "Entlass" klickt. Ich muss mich dann "erinnern", dass dieser Benutzer die Benachrichtigung abgewiesen hat, damit ich sie ihm nicht wieder zeige. Hier ist meine aktuelle Lösung
users
Tabelle hat auid
Primärschlüssel und Benutzerinformationennotifications
Tabelle hat anid
Primärschlüssel- und Benachrichtigungstextnotifications_seen
Tabelle mit zwei Spalten,uid
undnid
Wenn jemand auf eine Benachrichtigung klickt, speichere ich seine uid
und die Benachrichtigung nid
in notifications_seen
. Dies scheint gut zu funktionieren, aber Phpmyadmin hat riesige rote Nachrichten, die mir das sagen notifications_seen
hat keinen Index. Keine Säule ist jedoch einzigartig. Soll ich wirklich eine äußerst nutzlose Kolumne haben notifications_seen
Und nennen Sie das einen Primärschlüssel? Gibt es einen besseren Weg, dies zu tun?
Lösung
Sie können mehr als eine Spalte verwenden, um Ihren Primärschlüssel zu erstellen. In diesem Fall sollten Sie NID und UID als Hauptschlüssel in Ihrer Tabelle "Benachrichtigungen" festlegen. Die Idee hier ist, dass, obwohl weder NID noch UID in Ihrer Tabelle von Benachrichtigungen eindeutig sind. Das NID/UID -Paar ist einzigartig. Sie sollten diesen beiden Spalten eine primäre Schlüsselbeschränkung hinzufügen. Dies ist normalerweise das, was Sie für diese Art von Situation tun möchten.
Es gibt Zeiten, in denen Sie möglicherweise tatsächlich eine automatische Inkrementzeile erstellen möchten, um den Primärschlüssel zu vereinfachen. Wenn Ihr bester Kandidatenschlüssel beispielsweise aus vielen Spalten besteht (ich ziehe dies aus der Luft; sagen wir jedoch 4 oder mehr Spalten), oder Sie haben Spalten, die Zeichenfolgen enthalten. Das wäre langsamer zu passen, wenn sie nach Suchanlagen ausgehen. Für diese Situation sollte jedoch nur die primäre Schlüsselbeschränkung zu den beiden Spalten hinzugefügt werden.
Primärschlüssel werden standardmäßig indiziert; Aus diesem Grund sollten Sie den beiden Spalten einfach die primäre Schlüsselbeschränkung hinzufügen. Dadurch erhalten Sie auch die Integrität Ihrer Daten, indem Sie sicherstellen, dass Sie nicht versehentlich Zeilen mit demselben UID/NID -Paar einfügen.
Sie sollten auch eine fremde Schlüsselbeschränkung in der UID in die ID in der Benutzertabelle und eine fremde Schlüsselbeschränkung für die NID in der ID in der Benachrichtigungs -Tabelle hinzufügen. Durch das Hinzufügen der fremden Schlüsselbeschränkungen wird sichergestellt, dass Sie keine UIDs oder NIDs einfügen, die nicht tatsächlich in Ihre Benachrichtigung existieren.
Andere Tipps
Möglicherweise können Sie einen zusammengesetzten Primärschlüssel erstellen (bestehend aus beiden uid
und nid
).
Sie könnten einen Index machen notifications_seen
das beinhaltet beide Säulen! Oder erstellen Sie eine separate Spalte nur für einen Primärschlüssel oder tun Sie beides - mit einem Index eingeschaltet uid
und nid
könnte Beschleunigen Sie die Abfragen (aber machen Sie sich darüber keine Sorgen, bis Sie wichtige Leistungsprobleme bemerken - denken Sie daran für die Zukunft). Es ist keine schreckliche Sache, einen Hauptschlüssel für diese n: n -Beziehungen zu haben.