拆分桌子的好处

时间:2013-05-31 04:54:59

标签: oracle database-design

我的问题似乎更为笼统。但到目前为止我只有answer来自SO本身。我的问题是,我有一个表客户信息。我有47个字段。某些字段是可选的。我想将该表拆分为两个customer_info和customer_additional_info。其中一列是以字节格式存储文件。拆分表是否有任何好处。我看到JOIN将减慢查询执行速度。我可以有更多的PRO和CON将表分成两个吗?

3 个答案:

答案 0 :(得分:5)

我没有看到拆分表的好处,除非有些列很少被访问且相当大。保持行较小的理论优势在于您将在缓存块中获得更多行,并且您可以提高全表扫描和缓冲区缓存的效率。基于此,如果超过一个非常小的尺寸,我会谨慎地将此文件列存储在客户表中。

除此之外,我会把它放在一张桌子里。

答案 1 :(得分:2)

我只能想到两个支持拆分表的论据:

  • 如果Customer_Addition_info中的所有列都是相关的,那么您可能会获得单个表无法获得的额外声明性数据完整性的好处。例如,假设您的添加表是CustomerAddress。您的业​​务逻辑可能要求客户地址是可选的,但是一旦您拥有客户邮政编码,则地址L1,城市和州成为必填字段。如果这些列存在于customerAddress表中,则可以将这些列设置为非null。如果它们直接存在于客户表中,则无法执行此操作。

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

至于CONS,联接使事情变得更加困难和缓慢。您还冒着意外创建1对多关系的风险。 I.E.您在CustomerAddress表中创建了2个地址,现在您不知道哪个地址有效。

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

如果您的业务规则是客户地址是可选的,并且您在客户表中嵌入了addressL1,addressL2,City,State和Zip,则需要使这些字段中的每一个都为Nullable。这将允许某人插入一个城市但没有州的客户。您可以编写表级检查约束来涵盖这种情况。但这并不像简单地设置CustomerAddress表中的AddressL1,City,State和Zip列那样容易。需要明确的是,我并不主张使用多表方法。但是你问了优点和缺点,我只是指出这方面属于分类账的专业方面。

答案 2 :(得分:2)

我的第二个David Aldridge said,我只想添加关于文件列的一点(大概是BLOB)...

BLOB存储最多约。 4000字节内联 1 。如果很少使用BLOB,您可以指定DISABLE STORAGE IN ROW来存储它out-of-line,删除“缓存污染”而无需拆分表。

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


1 即在行本身。