2016-09-30 6 views
0

を借りることにより、アセットファイナンス、私は資産の異なる種類についての3つのテーブルを持っています。データベースの設計:<strong>家 とグランド</strong>、<strong>locative建物</strong>、および<strong>株式</strong>:私のデータベースでは

もう1つのテーブルは約です。借用です。

私は資産をリンクして借りる必要があります。ルールは次のとおりです。 - 1つの借用は1つのアセットのみにオプションの匿名リンクができます。 - 1つの資産をオプションで1つ以上の借入にリンクすることができます。

私は、このデータベースの設計を開始しました:それは働いていると、参照整合性はOKのようです

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

アサーションスキーマには異なるフィールド構造が含まれていますか –

+0

「さまざまな種類のアセット」が重要です。これを「別のサブクラスの資産」と言い換えると、その答えはここにあります:http://stackoverflow.com/questions/13749525/relational-database-design-multiple-user-types/13752304#13752304 –

+0

@AmitKumarはい、各ASSETテーブルには異なる列があります – NMD

答えて

0

解決策は、クラステーブル継承です。

クラステーブル継承を使用した場合は、テーブルを作成して、 をASSETS_GENERICと呼ぶことができます。タイプに関係なく、すべてのアセットはこのテーブルに というエントリを持ちます。今すぐ通常の方法で参照番号 BorrowingとAssets_genericとの間に拘束されたリンケージを作成できます(参考文献)。そして今度は あなたはASSETS_GENERICと各ASSETx テーブルの間の接続を行います。

関連する問題

 関連する問題