2017-06-01 3 views
1

ich das Backend eines Chat-System am Bau, für die ich habe eine Message Tabelle, die wie folgt aussieht:Zwei Fremdschlüssel auf eine Tabelle Bezug

enter image description here

Das Problem ist, dass ich zwei Fremdschlüssel müssen zeigen auf der gleichen Tabelle ID.

Kein Problem, aber in dem Fall, dass ein Benutzer mehrere Nachrichten sendet, sagt der Datenbank

eindeutige Einschränkung

Beispiel verletzt:

13 Testmessage1 01.06.17 08:15:01,456554000 2 (sender_id) 23 (receiver_id) 
14 Testmessage2 01.06.17 07:09:08,517000000 2 (sender_id) 23 (receiver_id) 

Die beiden letzten Identifikatoren sind die Benutzer-IDs, die beide gleich sind!

Wie kann ich damit umgehen?

+0

Nun, wenn eine einzelne Nachricht mehrere Empfänger haben könnte, möchten Sie eine Tabelle für die Empfänger der Nachricht erstellen, und verwenden Sie sie für eine viele zu viele Beziehung zwischen der Nachricht und der Empfänger-ID. –

+0

Eine Nachricht hat genau einen Empfänger, nicht multiplizieren. Ich habe eine Benutzertabelle. Die Nachrichtentabelle enthält Fremdschlüssel für die Benutzer-ID. Wenn ein Absender mehrere Nachrichten an denselben Benutzer schreibt, wird der Fehler "eindeutige Einschränkung verletzt" angezeigt. Das ist das Problem! Ich habe auch die beiden Schlüssel auf unique = False gesetzt. – Tim

+0

Dann ist Ihre eindeutige Einschränkung falsch. Es kann nicht nur auf Absender- und Empfänger-IDs basieren, Sie müssen auch etwas anderes darin einschließen. –

Antwort

1

Problem gelöst Ich schaute auf meine Constraints und ich sah, dass ich die einzigartigen Einschränkungen in meinem Django-Modell kombiniert habe.Ich habe das gelöscht und meine Datenbank migriert. Jetzt kann ich mehrere Nachrichten erstellen. Danke für deine Antworten!

0

Das Design scheint mir gut, aber der Schlüssel, den Sie auf dieser Messages Tabelle definieren, sollte anders sein. Es ist völlig in Ordnung, dass der Benutzer X eine Nachricht an Benutzern Y mehrfach sendet, so sehe ich zwei Möglichkeiten für Sie den Schlüssel definieren:

  • sender_id/receiver_id/gendate: es sollte nicht passieren, dass zwei Nachrichten aus dem gleichen Benutzer auf den gleichen Benutzer werden zur gleichen Zeit gesendet
  • ID: Sie bereits einen Ersatzschlüssel bereitstellt, können Sie verwenden, dass

Edit (weitere explaination)

Wenn Sie eine Tabelle definieren, können Sie auch Eindeutigkeitseinschränkungen definieren.

Angenommen, Ihre Tabelle hat einen eindeutigen Schlüssel definiert als (, receiver_id); damit sagst du dem dbms "Hey, lass mich nicht zwei Nachrichten mit den gleichen Werten von sender_id und receiver_id einfügen, denn das sind die Kriterien, die ich verwenden möchte, um eine Zeile eindeutig zu identifizieren". Auf diese Weise werden Sie bei der Auswahl eines Absenders und eines Empfängers sicher sein, dass Sie nicht mehr als eine Nachricht erhalten.

Wenn Sie eine Zeile mit den Werten 2 und 23 in Ihrer Tabelle haben, wird beim Versuch, eine andere Zeile mit denselben Werten einzufügen, diese Fehlermeldung angezeigt.

Meine erste Option sagt, dass, wenn Sie ändern, dass eindeutige Schlüssel auch gendate statt, umfassen, die dbms wird Ihnen versichern, dass es zwei Reihen nicht mit den gleichen sender_id, receiver_id UND gendate Werte sein. Die Zeilen, die Ihren Fehler verursachen, werden dann als unterschiedlich betrachtet. Die zweite Option besagt, dass wenn Ihr eindeutiger Schlüssel ID ist, Sie sogar mehrere Nachrichten gleichzeitig zwischen denselben Benutzern haben können, solange Sie für jede einzufügende Zeile einen anderen ID-Wert generieren.

+0

Ist Option 1 nicht die gleiche Struktur wie ich habe? – Tim

+0

Die Tabellenstruktur muss nicht geändert werden, eine der Optionen, die Sie auswählen; Was geändert werden muss, ist die Einschränkung, die Sie darauf festgelegt haben. Ihr aktueller Schlüssel ist wahrscheinlich als ('sender_id' /' receiver_id') definiert, und meine erste Option fügt 'gendate' hinzu; Auf diese Weise werden die zwei Zeilen, die derzeit gegen die Eindeutigkeitseinschränkung verstoßen, akzeptabel sein, weil sie für "gendate" unterschiedlich sind. –

+0

Entschuldigung, aber können Sie mir vielleicht ein Beispiel geben? Ich verstehe nicht wirklich, was Sie meinen – Tim

0

Der Schlüssel ist nicht die Eindeutigkeitseinschränkung zu verletzen, ich denke, das Problem ist nicht hier, müssen Sie eine vollständige Tabellenstruktur bieten, verstehe ich nicht eine Sache, warum müssen wir einen Fremdschlüssel einrichten, ich denke, dies wird die Systemflexibilität und Wartbarkeit verringern, ein wenig Schwierigkeit für die Entwicklung erhöhen, ich denke, wir sollten den Fremdschlüssel loswerden.

Verwandte Themen