首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MS Visio类别与SQL Server的关系

MS Visio类别与SQL Server的关系
EN

Stack Overflow用户
提问于 2010-01-21 00:12:39
回答 2查看 824关注 0票数 0

我正在使用MS Visio对数据库进行建模,模型的一部分包含事务类别-父表具有transactionId、timestamp、amount和transactionType。有三个子表-支票、银行转账和信用卡,它们都通过transactionId与父表相关。

这种关系在SQL Server中有没有具体的实现方式,或者它只是一个概念模型,让我来实现?如果是后者,如果表都与transactionId相关,为什么在父表中有一个transactionType列-这只是为了缩小我的查询范围吗?也就是说,如果父表中的某一行指定了" cheque“作为transactionType,我知道我只需要查询/连接cheque子表?

我突然想到--这只是一个ISA层次结构吗?在这种情况下,我将创建三个不同的表,每个表都包含ISA父实体中标识的列?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-21 00:25:11

这本质上是多表继承,尽管如果需要,您可以在域中将其建模为简单的引用关系。

拥有选择器字段/属性有很多很好的理由。显而易见的一点是,应用程序或服务可以获得有关如何加载细节的提示,这样就不必从每个可想到的表中加载每一行(当您有20种不同类型的事务时,请尝试此方法)。

另一个原因是,大多数情况下,最终用户不一定需要知道事务的详细信息,但确实需要知道事务的类型。如果您正在查看来自某些财务或账单系统的应收报告,大多数情况下,对于基本报告,您需要知道的所有内容就是以前的余额、金额、后续余额和交易类型。如果没有这些信息,就很难阅读。账本不一定会显示每笔交易的细节,有些系统甚至可能根本不会跟踪细节。

这种类型的模型最常见的替代方案是单个表,每个不同的事务类型都有一大堆可以为空的列。尽管我个人轻视这个模型,但它是许多只支持单表继承的对象关系映射器的要求。这是您希望(或不希望)在数据库中建模的唯一另一种方式。

票数 1
EN

Stack Overflow用户

发布于 2010-01-21 00:19:28

如果您想要查询所有交易,例如对每个交易类型的金额求和,则父表中的transactionType非常有用:

代码语言:javascript
运行
复制
select transactionType, sum(amount)
from transactions 
group by transactionType

在没有列的情况下,您仍然可以通过查询子表来执行此操作:

代码语言:javascript
运行
复制
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

正如您所看到的,这要困难得多,并且需要为您添加的每种类型的事务扩展查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2102842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档