2016-11-13 1 views
1

Ich habe eine Tabelle namens Produkte und eine Tabelle namens Kategorie und ich möchte sagen, dass jedes Produkt mindestens 1 Kategorie und höchstens 2 Kategorie haben muss, also wenn ich Recht habe, werde ich sagen, dass 1..N Produkte --- --- 1..2 Kategorie richtig? und das wichtigste Problem hier ist, wie ich diese Kardinalität mache? mache ich es in sql oder ich mache es nur in Server-Code (Logik)? und brauche ich einen gemeinsamen Tisch hier oder nicht?Wie nehme ich die Kardinalität vom Design zum Code?

Entschuldigung, wenn meine Frage schlecht ist, aber dieses Problem macht mein Projekt keinen Fortschritt.

Vielen Dank im Voraus.

Antwort

0

Das relationale Modell und SQL-Standards würden diese Art von Anforderung mit einer Assertion unterstützen. Aber AFAIK, die zurzeit SQL-Produkte versenden, unterstützen CREATE ASSERTION nicht.

Diese Art von Code erzwingt die Anforderung, dass pro Produkt nicht mehr als zwei Kategorien vorhanden sein dürfen.

create table product_categories (
    product_code char(1) not null, -- references products (product_code), not shown 
    category_num integer not null 
    default 1 
    check (category_num in (1, 2)), 
    category varchar(10) not null, 
    primary key (product_code, category) 
); 

insert into product_categories values 
('a', 1, 'wire'), 
('a', 2, 'cable'), 
('b', 1, 'panel'), 
('b', 2, 'plate'); 

Es sollte klar sein, dass jede „category_num“ neben 1 oder 2 eingefügt wird einen Fehler erhöhen. So kann jeder Produktcode nicht mehr als zwei Kategorien haben.

Um die Einschränkung durchzusetzen, dass jedes Produkt mindestens eine Kategorie haben muss, müssen Sie prozeduralen Code schreiben. Entweder Trigger oder gespeicherte Prozeduren funktionieren.


Eine Diskussion über das Hinzufügen von deklarativen Aussagen zu Oracle: SQL Assertions/Declarative multi-row constraints

+0

Ihre Antwort ist sehr gut, aber wenn ich es im Code machen, zum Beispiel, wenn ich eine Abfrage machen, wie viele Kategorien enthält dieses Produkt zu überprüfen und, wenn die Ausgabe ist 2 Zeilen, dann kann ich nicht zulassen, dass das Produkt mehr und umgekehrt hat ... ist das gut oder nicht effecient? –

+0

Es ist normalerweise besser, den Fehler einfach einzufügen, den Fehler (falls vorhanden) zu erfassen und entsprechende Maßnahmen zu ergreifen. Sie müssen trotzdem Fehler auffangen. Es gibt viele Dinge, die schief gehen können, abgesehen von bereits zwei Zeilen. (Ich würde das in einer gespeicherten Prozedur selbst tun und alle Einfügungen und Löschungen erfordern, um die gespeicherte Prozedur zu durchlaufen.) –

+0

ok danke für Hilfe: D –