SQL Oracle: Auftrittshäufigkeiten von Foreign Keys beschränken

mental.dIseASe

Lieutenant
Registriert
Dez. 2008
Beiträge
665
Guten Abend liebe Mitmenschen,

ich habe in einer Oracle-DB folgende Tabellenstruktur:

Code:
CREATE TABLE A
(
	ID NUMBER(10,0) NOT NULL,
	CONSTRAINT A_PK PRIMARY KEY 
	(
		ID 
	)
	ENABLE 
);

CREATE TABLE B
(
	ID NUMBER(10,0) NOT NULL,
	CONSTRAINT B_PK PRIMARY KEY 
	(
		ID 
	)
	ENABLE 
);

CREATE TABLE A_B
(	
	FK_A NUMBER(10,0) NOT NULL,
	FK_B NUMBER(10,0) NOT NULL,
	CONSTRAINT A_B_PK PRIMARY KEY 
	(
		FK_A, FK_B 
	)
	ENABLE 
);

ALTER TABLE A_B ADD CONSTRAINT A_B_FK_A FOREIGN KEY(FK_A) REFERENCES A(ID) ON DELETE CASCADE ENABLE;
ALTER TABLE A_B ADD CONSTRAINT A_B_FK_B FOREIGN KEY(FK_B) REFERENCES B(ID) ON DELETE CASCADE ENABLE;

Ich habe also zwei Tabellen, die in einer dritten Tabelle assoziiert sind. Mein Ziel ist es jetzt, die Auftrittshäufigkeit von FK_As in der Tabelle A_B zu begrenzen, also so, dass jedes FK_A maximal mit n anderen FK_Bs assoziiert werden darf. Nach Googeln und Rumprobieren habe ich herausgefunden, dass ich es nicht über ein einfaches Check-Constraint abfackeln kann, was mich ein bisschen erstaunt hat.

Google schlägt vor, dass man in A eine Spalte OCCURENCES vorsieht und die mit Triggern hoch- und runterzählt und auf die Spalte OCCURENCES dann ein BETWEEN-Constraint legt. Andere Vorschläge drehten sich um die Erstellung einer Materialized View, in der ich aus A_B nach FK_A gruppiert die Counts hole und darüber dann ebenfalls ein Constraint lege.

Letztendlich könnte ich diese Beschränkung natürlich auch nur in der Business-Logik vollziehen, aber Constraints Daten betreffend habe ich doch lieber (zumindest auch) in der Datenbank.

Irgendwie gefallen mir die Lösungen nicht, aber ich habe das Gefühl, dass ich einen Tod sterben muss. Hat noch jemand einen anderen Weg oder eine Handreichung, welcher Weg sich produktiv bewährt hat?

zum Gruße
mental
 
Die erste Lösung gefällt mir am besten, die adaptiere ich. Hatte nicht daran gedacht, dass ich statt einem OCCURENCES in A auch einfach eine laufende Nummer in A_B nehmen kann, die ich auf die range 1 bis n beschränke. Ist wohl zu spät. Danke!
 
Zurück
Oben