哪种表结构更好

时间:2009-04-07 03:50:45

标签: oracle database-design

我们必须创建几个表,仅用于在Oracle中进行报告。

选项1

应收款表

  • 引用号
  • 日期
  • TrnType例如:税,费,保费
  • 金额

选项2

应收款表

  • 引用号
  • 日期
  • 纳税
  • 高级

注意:对于给定的RefNo,所有类型的税,费和保费或其子集都可以存在。

什么是最佳结构(表格将有超过100k的记录)

4 个答案:

答案 0 :(得分:9)

这些都不是最好的(就DBA的想法而言)。最好的是(假设RefNo是唯一的,因此是主键):

Receivables:
    RefNo
    Date
ReceivableDollarVals:
    RefNo
    Type
    Amount

如果RefNo / Date是主键,也可以将日期添加到第二个表。

这允许您最小化那些没有所有三种类型的行的存储空间(尽管节省的是最小的)。然后使用WHERE子句组合两个表(或JOIN s)来进行查询。

它还允许您随意添加其他类型而无需重构数据库。

但是,您需要记住,第三范式是理想的。只要您了解其含义,违反规则以获得绩效是完全可以接受的。

100,000条记录实际上非常小,所以除非你认为你将在不久的将来添加更多类型,否则我会选择你的选项2并使用零来存储那些不存在的值。 NULL很可能会使您的查询更复杂。

答案 1 :(得分:1)

如果您的交易类型是明确定义的并且不太可能稀疏填充(即,大多数记录将具有所有3的值),则后者更可能是您的最佳选择。它还以一种格式表示数据,这种格式更接近于您在实际中对它的看法。

即使值很稀疏,“gut instict”也让我仍然倾向于基于列的方法而不是基于行的方法。

答案 2 :(得分:1)

第一个答案中完全标准化版本的真正优势在于需求发生变化时 - 当有人更改规格时,您必须添加超出您所识别的3的类型。

喜欢折扣,退款等等。这些变化确实发生了。

规范化结构应该可以让您更轻松地完成此操作,而无需更改表结构或大多数使用该数据的程序。

但规范化结构在开始时确实需要更多投资 - 每个新事务都涉及插入2个表,你需要有一个检查约束来控制类型等。

一般来说,你会在规范化结构的长期内做得更好。然而,有一个简单的例子,你有时可以在没有正常化的情况下离开,而不必付出后果(至少,没有人必须支付,直到你早已离开,这是别人的问题)。

专业上,合理的标准化水平应该是您的标准策略,您应该要求自己有非常好的理由进行非规范化。

答案 3 :(得分:0)

如果Table将有超过100k的记录。选项2是不错的选择。 Bcz选项1减慢了数据的访问速度。