2

我的问题可能看起来更笼统。但到目前为止,我得到的唯一答案是来自 SO 本身。我的问题是,我有一个表格客户信息。我有 47 个字段。有些字段是可选的。我想将该表拆分为两个 customer_info 和 customer_additional_info。其中一列是以字节格式存储文件。拆分桌子有什么好处。我看到 JOIN 会减慢查询的执行速度。我可以有更多将一张桌子分成两份的优点和缺点吗?

4

3 回答 3

5

除非某些列非常不常访问且相当大,否则我认为拆分表没有太大优势。保持小行有一个理论上的优势,因为您将在缓存块中获得更多行,并且您提高了全表扫描和缓冲区缓存的效率。基于此,如果此文件列的大小超过一个非常小的大小,我会谨慎地将其存储在客户表中。

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

于 2013-05-31T05:36:24.447 回答
2

我只能想到 2 个支持拆分表格的论点:

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

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

至于缺点,联接使事情变得越来越困难。您还冒着意外创建一对多关系的风险。IE 您在 CustomerAddress 表中创建了 2 个地址,现在您不知道哪个是有效的。

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

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

于 2013-05-31T05:15:37.253 回答
2

赞同大卫奥尔德里奇所说的,我只想补充一点关于文件列(大概是 BLOB)......

BLOB 最多可存储 1行 4000 字节。如果一个 BLOB 很少被使用,你可以指定DISABLE STORAGE IN ROW将其存储在out-of-line中,消除“缓存污染”而不需要拆分表。

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


1即在行本身中。

于 2013-05-31T21:15:21.720 回答