我正在使用MS Visio对数据库进行建模,模型的一部分包含事务类别-父表具有transactionId、timestamp、amount和transactionType。有三个子表-支票、银行转账和信用卡,它们都通过transactionId与父表相关。
这种关系在SQL Server中有没有具体的实现方式,或者它只是一个概念模型,让我来实现?如果是后者,如果表都与transactionId相关,为什么在父表中有一个transactionType列-这只是为了缩小我的查询范围吗?也就是说,如果父表中的某一行指定了" cheque“作为transactionType,我知道我只需要查询/连接cheque子表?
我突然想到--这只是一个ISA层次结构吗?在这种情况下,我将创建三个不同的表,每个表都包含ISA父实体中标识的列?
发布于 2010-01-20 16:25:11
这本质上是多表继承,尽管如果需要,您可以在域中将其建模为简单的引用关系。
拥有选择器字段/属性有很多很好的理由。显而易见的一点是,应用程序或服务可以获得有关如何加载细节的提示,这样就不必从每个可想到的表中加载每一行(当您有20种不同类型的事务时,请尝试此方法)。
另一个原因是,大多数情况下,最终用户不一定需要知道事务的详细信息,但确实需要知道事务的类型。如果您正在查看来自某些财务或账单系统的应收报告,大多数情况下,对于基本报告,您需要知道的所有内容就是以前的余额、金额、后续余额和交易类型。如果没有这些信息,就很难阅读。账本不一定会显示每笔交易的细节,有些系统甚至可能根本不会跟踪细节。
这种类型的模型最常见的替代方案是单个表,每个不同的事务类型都有一大堆可以为空的列。尽管我个人轻视这个模型,但它是许多只支持单表继承的对象关系映射器的要求。这是您希望(或不希望)在数据库中建模的唯一另一种方式。
发布于 2010-01-20 16:19:28
如果您想要查询所有交易,例如对每个交易类型的金额求和,则父表中的transactionType非常有用:
select transactionType, sum(amount)
from transactions
group by transactionType
在没有列的情况下,您仍然可以通过查询子表来执行此操作:
select
case when c.transactionId is not null then 'CHEQUE'
when cc.transactionId is not null then 'CREDIT CARD'
...
end
, sum(amount)
from transactions t
left join cheque c on t.transactionId = c.transactionId
left join creditcard cc on t.transactionId = cc.transactionId
...
group by
case when c.transactionId is not null then 'CHEQUE'
when cc.transactionId is not null then 'CREDIT CARD'
...
end
正如您所看到的,这要困难得多,并且需要为您添加的每种类型的事务扩展查询。
https://stackoverflow.com/questions/2102842
复制