In my Database, I have 3 tables about different kind of asset : house and ground, locative buildings, and stocks.
Another table is about borrowing.
Now I have to link assets and borrowing. The rules are : - one borrowing can optionnaly linked to only one asset. - one asset can optionnaly linked to one or more borrowings.
I started with this database design :
CREATE TABLE CUSTOMER
(
CUSTOMER_ID INT NOT NULL,
[...]
CONSTRAINT PK_CUS_ID PRIMARY KEY (CUS_ID)
)
CREATE TABLE ASSET1
(
ASSET1_ID INT NOT NULL,
CUSTOMER_ID INT NOT NULL,
[...]
CONSTRAINT PK_ASSET1_ID PRIMARY KEY (ASSET1_ID),
CONSTRAINT FK_ASSET1_CUSTOMER FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER (CUSTOMER_ID) ON DELETE NO ACTION ON UPDATE NO ACTION
)
CREATE TABLE ASSET2
(
ASSET2_ID INT NOT NULL,
CUSTOMER_ID INT NOT NULL,
[...]
CONSTRAINT PK_ASSET2_ID PRIMARY KEY (ASSET2_ID),
CONSTRAINT FK_ASSET2_CUSTOMER FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER (CUSTOMER_ID) ON DELETE NO ACTION ON UPDATE NO ACTION
)
CREATE TABLE ASSET3
(
ASSET3_ID INT NOT NULL,
CUSTOMER_ID INT NOT NULL,
[...]
CONSTRAINT PK_ASSET3_ID PRIMARY KEY (ASSET3_ID),
CONSTRAINT FK_ASSET3_CUSTOMER FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER (CUSTOMER_ID) ON DELETE NO ACTION ON UPDATE NO ACTION
)
CREATE TABLE BORROWING
(
BORROWING_ID INT NOT NULL,
CUSTOMER_ID INT NOT NULL,
ASSET1_ID INT NULL,
ASSET2_ID INT NULL,
ASSET3_ID INT NULL,
[...]
CONSTRAINT PK_BORROWING_ID PRIMARY KEY (BORROWING_ID),
CONSTRAINT FK_BORROWING_CUSTOMER FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER (CUSTOMER_ID) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT FK_BORROWING_ASSET1 FOREIGN KEY (ASSET1_ID ) REFERENCES ASSET1 (ASSET1_ID ) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT FK_BORROWING_ASSET2 FOREIGN KEY (ASSET2_ID ) REFERENCES ASSET2 (ASSET2_ID ) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT FK_BORROWING_ASSET3 FOREIGN KEY (ASSET3_ID ) REFERENCES ASSET3 (ASSET3_ID ) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT CHK_BORROWING CHECK
(
((ASSET1_ID IS NULL) AND (ASSET2_ID IS NULL) AND (ASSET3_ID IS NULL))
OR ((ASSET1_ID IS NOT NULL) AND (ASSET2_ID IS NULL) AND (ASSET3_ID IS NULL))
OR ((ASSET1_ID IS NULL) AND (ASSET2_ID IS NOT NULL) AND (ASSET3_ID IS NULL))
OR ((ASSET1_ID IS NULL) AND (ASSET2_ID IS NULL) AND (ASSET3_ID IS NOT NULL))
)
)
It is working and referential integrity seems to be OK.
But I already know that I will have to add more assets in my database in the future and the CHK_BORROWING will become a monster.
My question : Is there a better, cleaner, simpler solution ?
Thank you