我们必须创建几个表,仅用于在Oracle中进行报告。
选项1
应收款表
选项2
应收款表
注意:对于给定的RefNo,所有类型的税,费和保费或其子集都可以存在。
什么是最佳结构(表格将有超过100k的记录)
答案 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减慢了数据的访问速度。