Kann / Wie fügen Sie einen Kreis von Referenzen ohne RI zu brechen?
-
05-07-2019 - |
Frage
Ich bin in erster Linie daran interessiert, pgsql für diese, aber ich frage mich, ob es eine Möglichkeit, in jedem RDBMS ist eine Insert Operation zu tun, ohne zu deaktivieren und erneut aktiviert jede FOREIGN KEY oder NOT NULL Einschränkungen auf zwei Tabellen, die sich aufeinander beziehen. (Sie könnte als ein Huhn daran denken, die irgendwie aus dem eigenen Ei geboren wurde.)
Ein praktisches Beispiel, wenn Sie ein Multiple-Choice-Quiz-System haben, mit Tabellen „Frage“ und „Antwort“, wo question.correct_answer auf answer.id bezieht und answer.question auf question.id bezieht, ist es möglich, eine Frage und ihre Antworten gleichzeitig?
hinzufügen(Für das Protokoll, ich bin mir dessen bewusst, dass Sie die Sperrung tun können, und die erneute Aktivierung in einem Transaktionsblock, und dass eine andere Lösung ist nicht eine correct_answer Spalte haben, sondern answer.correct als boolean haben und haben ein überprüfen Einschränkung dafür, dass es genau eine richtige Antwort pro Frage. Aber ich bin nicht neugierig auf alternative Lösungen hier.)
Lösung
Ich denke, dass Sie Ihre eigene Frage beantwortet - Sie einen Transaktionsblock zu machen. In PostgreSQL sollte diese Arbeit:
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO questions (questionid, answerid, question)
VALUES (1, 100, 'How long are Abraham Lincoln\'s legs?');
INSERT INTO answers (answerid, questionid, answer)
VALUES (100, 1, 'Long enough to reach the ground.');
COMMIT;
Es hat in einem Transaktionsblock sein, weil, wenn eine INSERT-Anweisung die Datenbank ist fehlgeschlagen in einem ungültigen Zustand wäre (Tabellenbedingungen nicht erfüllt werden).
Andere Tipps
ich es in der folgenden Art und Weise tun würde:
- definieren Questions.correct_answer als Nullable-Spalte.
- Zeile einfügen in Fragen, mit correct_answer auf NULL gesetzt.
- Einfügen Zeile (n) in Antworten, Verweis auf die Zeile in Fragen.
- UPDATE Fragen SET correct_answer =?
Im einfachen Fall einer Frage und eine Antwort ist es ratsam, nur alle Attribute in eine Tabelle zu setzen.