我应该将贷款,购买和销售表格归一化到一个表格中吗?

时间:2010-06-16 23:48:04

标签: sql oracle informix denormalization

根据我在下面提供的信息,你能否就是否一个好的想法将单独的表重新规范化为一个包含不同类型合同的表来表达你的看法?..什么是专业人士/骗子?有人试过这个吗?..银行系统使用CIF(客户信息文件)[主],客户可能有不同类型的账户,CD,抵押等,并使用交易代码[类型],但他们将它们存储在一个表中?

我有贷款,购买和购买的单独表格。销售交易。来自每个表的行以下列方式连接到其相应的客户:

customer.pk_id SERIAL = loan.fk_id      INTEGER; 
                      = purchase.fk_id  INTEGER; 
                      = sale.fk_id      INTEGER;  

由于这些表中存在许多共同属性,这些属性围绕相同的商品:典当,买卖,我通过将它们合并到一个名为“合同”的表中进行实验,并添加了以下列:

Contracts.Type char(1) {L=Loan, P=Purchase, S=Sale}

情景:

客户最初瞄准商品,进行一些利息支付,然后决定将商品卖给典当行,典当商然后将商品放入库存并最终将其出售给另一个客户。

我设计了一个通用表格,例如:

Contracts.Capital DECIMAL(7,2) 

在贷款合同中持有典当本金额,在购买中持有购买价格,在销售中持有销售价格。

这个设计是个好主意还是应该将它们分开?

2 个答案:

答案 0 :(得分:3)

你的桌子第二个设计更好,并且“正常化”。

你首先设计的是非规范化的一个!

您基本上遵循称为“子类型/超类型”的数据库设计/建模模式 用于处理诸如交易的事情,其中​​存在大量公共数据和特定于每个交易类型的一些数据。

有两种方法可以对此进行建模。如果变量数据是最小的,则在单个表中保持everthing,其中事务类型specfic属性保存在“nullable”列中。 (这基本上是你的情况,你已经做了正确的事情!)。

另一种情况是“不常见”数据根据事务类型的不同而变化,在这种情况下,您拥有一个包含所有“公共”属性的表,并且每个类型的表都包含“uncommon”属性“类型”。

然而,“LOAN”,“PURCHASE”和“SALE”作为交易有效。我认为库存是一个不同的实体,应该有一个独立的表。基本上“贷款”将添加到库存交易,“购买”将库存状态更改为可售和“销售”将从库存中删除该项目(或将状态更改为已售出)。将项目添加到库存后,其状态应该更改(它仍然是小部件,小提琴或其他)。

答案 1 :(得分:1)

我认为它不是非规范化的。我看不到重复的群体;所有属性取决于唯一的主键。听起来对我来说是一个很好的设计。

这里有问题吗?您只是在寻找可以接受的确认吗?

假设,如果压倒性的共识是你应该恢复到每种类型的单独表格,你会怎么做?你会忽略你自己的经验证据(更好的性能,更简单的编程)并遵循Stackoverflow.com的建议吗?