2016-09-30 51 views
0

在我的數據庫資產融資,我對不同類型資產的3個表:房子 和地面處所建築,並數據庫設計:通過借用

另一個表是關於借用。我現在不得不鏈接資產和借款。規則是: - 一個借款可以optionnaly只鏈接到一個資產。 - 一個資產可以optionnaly鏈接到一個或多個借款。

我開始與這個數據庫的設計:

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)) 
) 
) 

這是工作和參照完整性似乎是確定。

但我已經知道我將來不得不在數據庫中添加更多資產,CHK_BORROWING將成爲怪物。

我的問題:是否有更好,更清潔,更簡單的解決方案?

謝謝

+0

您ASSET_架構包含不同的字段結構 –

+0

您的問題的關鍵是「不同類型的資產」。如果這可以被重新設置爲「不同的資產子類」,那麼答案可能在這裏:http://stackoverflow.com/questions/13749525/relational-database-design-multiple-user-types/13752304#13752304 –

+0

@AmitKumar是的,每個ASSET表具有不同的列 – NMD

回答

0

正如沃爾特米蒂建議,解決方案是類表繼承。

如果您使用了類表繼承,您可以創建一個表,我們的 稱之爲ASSETS_GENERIC。每種資產(無論類型)在此表中都有 條目。現在,您可以通過常規方式(參考)在 借入和Assets_generic之間建立約束鏈接。現在 您在ASSETS_GENERIC和每個ASSETx 表之間建立連接。