2013-05-12 54 views
0

Here,關於此問題有一個很好的答案,但我沒有找到關於接下來是什麼的明確示例,例如查詢(select)。數據庫(邏輯數據模型)的繼承示例

我將描述一個例子,我想知道如果我這樣做也是正確的:

我們對金基類:

Payments(code_payment (PK), description) 

然後,我們有3子類(3型動物類型繼承的付款):

Cash(code_payment (FK)) 
CreditCard(creditcard_account , code_payment(FK)) 
PromissoryNote(pay_date , code_payment(FK)) 

例如:對插入語句,第一,插入付款表和第二,這取決於付款類型(我認爲你在代碼中使用if/else子句來區分付款類型並執行正確的「插入語句」),插入屬於哪裏。那麼select語句會發生什麼?

想象一下,我想知道有什麼類型的支付的特定文檔假設我有一個表稱爲文件它與付款連接表(所以文檔表格有一個外鍵付款(code_payment ))。

首先我應該做的是使對文件和支付表的查詢(基本上是一個內部連接),然後,根據結果(現金,credic卡或得到「說明」支付的本票)在所屬的表上進行查詢。

這是我想要做的嗎?我的方式是否正確?也許它可以工作,但它看起來像一點點...你知道..沒有優雅的解決方案。我對此有點困惑。

在此先感謝。

回答

1

通常情況下,您將爲每個「子類」構建一個可更新的視圖。每個視圖都會將「基類」表與「子類」表連接起來。

應用程序代碼使用視圖而不是基表。

由於付款類型是獨佔的 - 單一付款不能同時是現金和信用卡 - 您需要使用重疊限制。

create table payments (
    code_payment integer not null, -- I hope this is some kind of payment identifier. 
    payment_type char(2) not null 
    check (payment_type in ('CA', 'CC', 'PN')), 
    amount decimal(14, 2) not null check (amount > 0), 
    other_columns char(1) not null default 'X', 
    primary key (code_payment), 
    unique (code_payment, payment_type) 
); 

create table cash_payments (
    code_payment integer not null, 
    payment_type char(2) not null default 'CA' 
    check (payment_type = 'CA'), 
    other_columns char(1) not null default 'X', 
    primary key (code_payment), 
    unique (code_payment, payment_type), 
    foreign key (code_payment, payment_type) 
    references payments (code_payment, payment_type) 
); 

信用卡付款和本票付款表類似。

payments (code_payment, payment_type)上的唯一約束條件允許這些列成爲外鍵約束的目標。表「cash_payments」中的檢查約束和外鍵約束保證「cash_payments」中的行將始終與付款表中的現金行匹配;他們無法匹配任何其他類型的行。 「cash_payments」中的唯一限制使命名列成爲更多外鍵約束的目標,就像「付款」中的唯一約束一樣。

想象一下,我想知道有什麼類型的支付的特定文檔假設我有一個表中調用它與支付表(所以文檔表格連接有一個外鍵付款*(code_payment文件)* )。

文檔可以與付款與一個外鍵引用要麼

  • 的「code_payment」一欄,或
  • 一對「code_payment」和「payment_type」列。

如果「documents」表引用了一對列,那麼您知道付款的類型,因此您知道需要加入哪個表。

+0

我在考慮在新表中分類付款(TypesPayments,例如有兩個字段(代碼和付款名稱),所以,在您的「payments」表中的「payment_type」字段將是一個整數是引用新TypesPayments的主鍵的外鍵)。所以,如果我想知道什麼類型的付款是,我必須對支付類型進行查詢,其次,對TypesPayments的另一個查詢。 – danigonlinea 2013-05-16 09:18:23

+0

我沒有在我的項目中使用檢查約束或視圖。 (我正在直接使用基表)。但你改變了主意。謝謝你對我來說真的很有用。我必須學習。 – danigonlinea 2013-05-16 09:31:24