Oracle 拆分表格的优点

Oracle 拆分表格的优点,oracle,database-design,Oracle,Database Design,我的问题似乎更一般。但我唯一能做到的就是远离所谓的“自我”。我的问题是,我有一个客户信息表。我有47个字段。有些字段是可选的。我想将该表分为两个客户信息和客户附加信息。其中一列以字节格式存储文件。分开桌子有什么好处吗。我看到联接会减慢查询的执行。把一张桌子一分为二,我能有更多的优点和缺点吗 我只能想到两个赞成拆分表的参数: 如果Customer\u Addition\u info中的所有列都是相关的,那么您可能会获得额外的声明性数据完整性的好处,而这是单个表所无法获得的。例如,假设您的添加表是

我的问题似乎更一般。但我唯一能做到的就是远离所谓的“自我”。我的问题是,我有一个客户信息表。我有47个字段。有些字段是可选的。我想将该表分为两个客户信息和客户附加信息。其中一列以字节格式存储文件。分开桌子有什么好处吗。我看到联接会减慢查询的执行。把一张桌子一分为二,我能有更多的优点和缺点吗

我只能想到两个赞成拆分表的参数:

  • 如果Customer\u Addition\u info中的所有列都是相关的,那么您可能会获得额外的声明性数据完整性的好处,而这是单个表所无法获得的。例如,假设您的添加表是CustomerAddress。您的业务逻辑可能规定客户地址是可选的,但一旦您有了客户邮政编码,addressL1、City和State将成为必填字段。如果customerAddress表中存在这些列,则可以将它们设置为非null。如果它们直接存在于customer表中,则无法执行此操作

  • 如果您正在进行一些对象关系映射,并且您的客户类包含许多子类,并且您不想使用单表继承。有时,当需要不同存储布局的不同子类具有相似属性时,STI会产生问题。由于所有子类都必须使用同一个表,因此可能会出现名称冲突。另一种方法是类表继承,其中有一个表用于超类,另一个表用于每个子类。这与您在问题中描述的场景类似

至于缺点,加入会使事情变得越来越困难和缓慢。您还可能会意外地创建一对多关系。也就是说,您在CustomerAddress表中创建了2个地址,现在您不知道哪一个是有效的

编辑: 让我进一步解释声明性ref完整性点


如果您的业务规则规定客户地址是可选的,并且您在客户表中嵌入了addressL1、addressL2、City、State和Zip,那么您需要使这些字段中的每一个都可以为空。这将允许某人插入一个城市但没有州的客户。您可以编写一个表级检查约束来覆盖这种情况。但这并不像简单地将CustomerAddress表中的AddressL1、City、State和Zip列设置为不可空那么简单。明确地说,我并不提倡使用多表方法。然而,你问了正反两方面的问题,我只是指出这一方面属于分类账的正反两方面。

我认为拆分表没有什么好处,除非某些列很少被访问并且相当大。在缓存块中获得更多行时,保持行小在理论上是有好处的,并且可以提高全表扫描和缓冲区缓存的效率。基于此,如果这个文件列的大小非常小,我会小心地将其存储在customer表中

除此之外,我将把它放在一个表中。

我想补充一点,关于文件列(大概是BLOB)

BLOB最多可在线存储约4000字节1。如果很少使用BLOB,则可以指定
禁用行中的存储
来存储它,从而消除“缓存污染”,而无需拆分表

但无论你做什么,在做出最终决定之前,都要衡量对实际数据量的影响



1也就是说,在行本身。

这里我不遵循声明性完整性参数——您能进一步解释吗?如果您谈论的是检查约束,我会认为单个表将具有优势,因为它将比您可以包含在约束中的列组合提供更大的灵活性。如果您的业务规则是客户地址是可选的,并且您嵌入了addressL1、addressL2、City、State,在你的客户表中,你需要使每个字段都可以为空。啊,我明白了,我不认为在它自己的表中放这样的东西会有太大的争议。这个表规范化了吗?您能按名称/用途列出可选列吗?