2013-05-12 90 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