Oracle 哪种表结构更好

Oracle 哪种表结构更好,oracle,database-design,Oracle,Database Design,我们必须创建几个表,以便在Oracle中进行报告 选择1 应收账款表 参考号 日期 税、费、保险费 数量 选择2 应收账款表 参考号 日期 税 费用 溢价 注:对于给定参考号,可以存在所有类型的税、费和溢价或它们的子集 最佳结构是什么(表将有超过10万条记录)如果您的事务类型是明确定义的,并且不太可能稀疏填充(即,大多数记录都有所有3条记录的值),则后者更有可能是您的最佳选择。它还以一种更接近您实际想法的格式表示数据 即使这些值可以是稀疏的,“gut Instit”使我仍然倾向于基于列的

我们必须创建几个表,以便在Oracle中进行报告

选择1

应收账款表

  • 参考号
  • 日期
  • 税、费、保险费
  • 数量
选择2

应收账款表

  • 参考号
  • 日期
  • 费用
  • 溢价
注:对于给定参考号,可以存在所有类型的税、费和溢价或它们的子集


最佳结构是什么(表将有超过10万条记录)

如果您的事务类型是明确定义的,并且不太可能稀疏填充(即,大多数记录都有所有3条记录的值),则后者更有可能是您的最佳选择。它还以一种更接近您实际想法的格式表示数据


即使这些值可以是稀疏的,“gut Instit”使我仍然倾向于基于列的方法,而不是基于行的方法。

这两种方法实际上都不是最好的(就DBA的思维方式而言)。最好是(假设RefNo是唯一的,因此是主键):

如果RefNo/Date是主键,则也将Date添加到第二个表中

这使您可以最大限度地减少没有全部三种类型的行的存储空间(尽管节省的空间很小)。然后使用
WHERE
子句组合两个表(或
JOIN
s)进行查询

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

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


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

在第一个答案中,完全规范化版本的真正优势在于当需求发生变化时——当有人改变规范时,您必须添加超出您已识别的3个类型之外的类型

比如折扣、退款等等。这些变化确实发生了

规范化结构应该让您更容易做到这一点,而无需更改表结构或使用数据的大多数程序

但是规范化结构在开始时确实需要更多的投资——每个新事务都需要插入到两个表中,您需要有一个检查约束来控制类型,等等

一般来说,从长远来看,使用规范化结构会做得更好。然而,像这样一个简单的例子,你有时可以不正常化而逃脱,并且不必为此付出代价(至少,在你离开很久之前,没有人需要付出代价,这是别人的问题)


从专业角度来说,合理的规范化水平应该是你的标准策略,你应该要求自己有很好的理由去规范化

If表将有超过100k条记录。那么选项2是一个不错的选择。Bcz选项1降低数据访问速度。

+1。它也不可能为同一个参考号指定不同的日期。将数据存储在谨慎的字段中而不是单独的行中并不一定违反3NF。违反3NF意味着这些值与主键(refno)没有直接关系。如果是这样的话,我会非常惊讶。好的观点,@Adam,因为3NF只是一个列,取决于键,整个键,除了键什么都没有。我们仍然设计表以避免问题中给出的方法,但那是因为我们倾向于有很多可能为空的“列”。也许我应该把我的方法称为3.5NF:-)澄清:因为我标注了这个表的尺寸,所以非规范化是可以接受的(因为在没有这种类型的表的情况下,需要很多联接才能得到摘要)。@SecretWiz,您期望的表大小(两行[您说的是“仅用于报告”)。这是否意味着数据是从其他系统拉入Oracle的。如果是这样,这将意味着设计不需要过度担心用于更新/完整性目的的规范化。
Receivables:
    RefNo
    Date
ReceivableDollarVals:
    RefNo
    Type
    Amount