diese Datenbank mit 4 Tabellen (Primärschlüssel in Sternchen) Erwägen Sie eines Produkts im Vergleich zu seiner Version 2015). Die Geschäftsregeln sind derart, dass ein Order
für einen Product
nur einen einzigen ProductRevision
, z. Eine Bestellung kann nicht sowohl die Versionen 2014 und 2016 des gleichen Produkts anfordern, sie können nur die 2014 oder 2016 Version haben.eine eindeutige Einschränkung für eine Beziehung 2 Grad entfernt
Normalerweise wäre dies kein Problem sein: die OrderItems
Tabelle eine ProductId
Spalte mit einer UNIQUE
Einschränkung für OrderId
und ProductId
haben würde. Doch weil OrderItems
‚s Referenzen ProductRevisionId
(so der Hinweis auf die ProductId
indirekt ist) bedeutet dies eine einfache UNIQUE
Einschränkung fehlschlägt und das Schema folgende Daten akzeptieren würde, auch wenn es als pro Geschäftsregeln ungültig ist:
Products
ProductId, SkuText
1, 'Kingston USB Stick'
ProductRevisions
ProductId, RevisionId, ...
1, 1, '2014 model'
1, 2, '2016 model'
Orders
OrderId
1
OrderItems
OrderId, ProductRevisionId, Quantity
1, 1, 100
1, 2, 50 -- Invalid data! Two revisions of the same Product should not be in the same order.
Was ich brauche, ist so etwas wie dieses:
ALTER TABLE OrderItems
ADD CONSTRAINT UNIQUE (OrderId, SELECT ProductId FROM ProductRevisions WHERE RevisionId = OrderItems.ProductRevisionId)
ich will nicht meine OrderItems
Tabelle denormalize durch Hinzufügen einer expliziten ProductId
Spalte, weil das eine potenzielle Fehlerquelle hinzufügt, wenn die Eltern/Kind-Beziehung zwischen einem gegebenen ProductId
und ProductRevisionId
sollten geändert werden, dann werden die Daten ungültig.
Was sind meine Optionen?
"Der Nachteil dieser Methode ist, dass ein Produkt nur in einer Zeile in jeder Reihenfolge erscheinen kann." - das ist kein Nachteil, das ist genau das, was ich habe :) – Dai