4 Stimmen

Wie lässt sich diese Einschränkung der Datenintegrität am besten durchsetzen?

Ich habe 3 Tabellen (nennen wir sie Foo, Bar und Baz.

Tische:

Foo

  • FooId

Bar

  • BarId
  • FooId

Baz

  • BazId
  • BarId
  • Ein andererWert

Die Fremdschlüssel sorgen natürlich dafür, dass jede Baz mit einer Bar und damit mit einer Foo verbunden ist. Jetzt möchte ich sicherstellen, dass für jeden Satz von Baz mit demselben "AnotherValue" alle zugehörigen Foo's eindeutig sind

Zum Beispiel, wenn ich

Foos (1, 2, 3)
Bars ((10, 1), (11, 1), (12, 1), (13, 2))
Bazs ((100, 10, "a"), (101, 10, "b"), (102, 13, "a"), (104, 11, "b"))

Dies sollte blockiert werden, da Baz 104 und Baz 101 beide den AnotherValue "b" und Foo 1 haben.


Optionen, an die ich gedacht habe (in der Reihenfolge meiner derzeitigen Vorlieben)

Indizierte Ansicht

Ich könnte eine Ansicht über diese drei Tabellen erstellen und einen eindeutigen Index auf die beiden Spalten setzen

Berechnete Säule

FooId als berechnete Spalte zu Baz hinzufügen. Fügen Sie dann einen Index auf AnotherValue und FooId hinzu.

Beschränkungen prüfen

Ich bin mir ziemlich sicher, dass dies hinzugefügt werden kann und auch funktionieren wird. Ich habe nicht verwendet Check Einschränkungen viel, und ich bin nicht sicher, ob es der beste Weg, dies zu tun ist.

Auslöser

Ich finde das einfach hässlich.

1voto

JNappi Punkte 1485

Ich bin nicht sicher, dass ich die Frage vollständig verstehe, aber es scheint, dass Sie die FooId in die Baz-Tabelle übertragen und einen alternativen Schlüssel (eindeutige Einschränkung) auf FooId, AnotherValue hinzufügen möchten.

Baz
•BazId
•BarId
•FooId
•AnotherValue

0voto

Beth Punkte 9425

Nur eine Wiederholung unter anderen Namen:

Parent (ParentID) 
       (1, 2)
Child (ChildID, ParentID) 
       ((10, 1), (11, 1), (13, 2))
GrandChild (GCID, ChildID, GCAndParentVal) 
       ((100, 10, "a"), (101, 10, "b"), (102, 13, "a"), (104, 11, "b"))

Könnten Sie dieses Feld in einer anderen Tabelle mit der parentID und baz.anotherValue haben, anstatt es in die Tabelle mit der childID aufzunehmen?

wie diese:

Parent (ParentID) 
       (1, 2)
Child (ChildID, ParentID) 
       ((10, 1), (11, 1), (13, 2))
GrandChild (GCID, ChildID, ...) 
       ((100, 10, ...), (101, 10, ...), (102, 13, ...), (104, 11, ...))
AnotherChildValue (ParentID, AnotherVal)
       ((1, "a"), (1, "b"), (2, "a"), (1, "b"))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X