日期:2014-05-17  浏览次数:20674 次

一点数据库设计的小疑问
一个常见的情况,很多子订单都属于一个大订单,每个子订单都有一项叫金额,子订单和大订单放在不同的表里,至于大订单的总金额这一项,是应该在大订单的表里加一个字段来存储算出来的属于他的子订单的总金额呢?还是不加字段,只是在用到的时候从数据库里多表查询搜索子订单并计算它们的总和呢?后一种效率可以差一些,不过又觉得大表里多了一个字段,更新不及时可能会冗余。
大家说说看法

------解决方案--------------------
如果在大订单表加字段可能要用个触发器,建议不加字段,直接求和。
------解决方案--------------------
用到触发器,可能就会影响到效率。
如果程序能有保证,可以增加这个字段,毕竟这样避免了每次求和
子订单的增加/修改/删除,描述的不是很清楚,不知道具体是如何操作
------解决方案--------------------
毛主席教导我们说要实事求是,嘿。落实到软件开发就是需求决定设计。

只要分清两种情况的优劣,自然知道如何选择:

触发器:在更新子订单时,同时更新大订单的总金额字段。
程序求和:只有在查询大订单的总金额的时候才计算。

触发器优劣:在查询大订单的总金额的时候会非常快,但是在更新子订单的时候会多出一部分操作,使子订单更新变慢。
程序求和优劣:相反。

触发器适用:如果你的主要应用模式是查询大订单相关信息,很少更新子订单。
程序求和适用:频繁更新子订单,偶尔查询大订单信息。
------解决方案--------------------
范式 一般我设计数据库的时候第一个版本会严格遵循几个范式的要求
但是在现实中为了某些反面如效率的要求,我们会引入冗余字段
在这里主要是看你对求和字段的查询频率是不是很频繁,如果是,不妨增加这个字段,但是最好不要使用触发器,尽量用事务在逻辑里面处理
这是我的意见