不精简一对一关系是否有意义?


12

如果我们的表A与表B具有一对一的关系,将它们分开会有意义吗?还是将它们组合成一个表永远不会受到伤害?这两种情况(两个表或一个组合表)中的任何一个是否会影响其正常形式(1NF,2NF,3NF等)?


5
您是指1对1还是1对0或1?
jpmc26

Answers:


30

是的,有很多原因使之成为更好的设计。

您可能具有继承/扩展关系,例如,您可能有一个User表,然后是一个Administrator包含更多字段的表。两个表都可能具有用户ID的主键(因此具有1:1关系),但并非所有用户在Administrator表中都会有一条记录。如果要支持工作流程,则需要类似的东西,例如一张ScheduledTask桌子和CompletedTask一张桌子。

您可能希望有一个轻量级的表来存储常用数据User,然后有一个更大的表来存储不需要的数据UserDetails。这可以提高性能,因为您可以将更多记录放入单个数据页中。

您可能需要对表具有不同的权限,例如UserUserCredentials

您可能需要不同的备份策略,因此将两个表放在不同的分区上,例如TransactionTransactionArchive

您可能需要的列数超出了单个表所能支持的列数,例如,如果需要索引的大型文本列很多,并且数据库平台限于4K数据页或其他内容。


如果表中的列多于数据库系统所能支持的列,则说明存在设计问题。但是,否则,您的答案是正确的。
罗伯特·哈维

2
同意...我正在尝试列出详尽的清单,而不是针对每个原因进行编辑。
John Wu

您的工作流程背景是什么?您有使用的特定软件吗?您是否推出了自己的工作流程系统?
罗伯特·哈维

1
物理=与物理限制有关,例如服务器性能,页面大小,索引,群集,备份等。这些都不影响逻辑设计。从纯粹的逻辑角度来看,应将单个实体概念化为单个表中的单个元组或行。
约翰·吴

4
链接 “当一个父记录或字段只有零个或一个子记录时,就会在关系数据库中发生一对一的关系。”
John Wu

6

除了@ john-wu的出色答案之外,另一个原因是当您具有BLOB类型的列(如图片)时。

您希望将BLOB列放在单独的表中,不仅可以更快地查询用户表,还因为可以将包含blob的表移动到便宜,慢速存储的其他表空间中,从而将查询最多的数据保留在表中。主表空间上的存储速度更快。


3

只有当您希望表B中的相关记录是可选的时,一对一关系才真正有意义

有时您想要的是变体记录标记联合。这意味着您有多个包含不同信息的表,但所有表都以一对一的关系与表A相关。然后,根据表A中的字段选择要关联的表

例如:

type Transaction(The_Type: PaymentType := Cash) is record

    Amount: Integer;

    case The_Type is
        when Cash =>
            Discount: boolean;
        when Check =>
            CheckNumber: Positive;
        when Credit =>
            CardNumber: String(1..5);
            Expiration: String(1..5);
    end case;
end record;

如果是可选的,那么这与在一个表中并仅选择所需的列有何不同?
第29摇盐机2016年

即使其中没​​有任何内容,您也要付出在主表中具有这些附加字段的代价。如果您的变体记录中有多个表,则单个表中可能有100列,其中大多数时间大部分都不使用。
罗伯特·哈维

2

在业务建模中,逻辑上与业务角度分离的两个实体A和B通常映射到不同的表。

例如,在使用面向对象的方式进行业务建模时,通常会使用某种对象关系映射。您可以从对象模型开始,然后从中获取关系模型。因此,请想象在您的对象模型中创建了类A和B,尽管它们具有1:1对应关系,但由于单一责任原则,它们应该保持分离。请注意,在对象模型中,这些类不仅仅是具有属性的表,它们还可以表示业务对象,并且在方法中实现了某些行为。现在,当您将这些类直接映射到关系模型时,您将获得具有1:1关系的单独的表A和B。

以我的经验,在创建业务或OO数据模型时,这种逻辑上的分离对于1:1关系而言要比“物理”原因(例如性能,个人安全性或分区)更为典型。


您能否举一个具体例子说明您的意思?
日,第29摇盐机
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.