Answers:
是的,有很多原因使之成为更好的设计。
您可能具有继承/扩展关系,例如,您可能有一个User
表,然后是一个Administrator
包含更多字段的表。两个表都可能具有用户ID的主键(因此具有1:1关系),但并非所有用户在Administrator
表中都会有一条记录。如果要支持工作流程,则需要类似的东西,例如一张ScheduledTask
桌子和CompletedTask
一张桌子。
您可能希望有一个轻量级的表来存储常用数据User
,然后有一个更大的表来存储不需要的数据UserDetails
。这可以提高性能,因为您可以将更多记录放入单个数据页中。
您可能需要对表具有不同的权限,例如User
和UserCredentials
您可能需要不同的备份策略,因此将两个表放在不同的分区上,例如Transaction
和TransactionArchive
您可能需要的列数超出了单个表所能支持的列数,例如,如果需要索引的大型文本列很多,并且数据库平台限于4K数据页或其他内容。
除了@ john-wu的出色答案之外,另一个原因是当您具有BLOB类型的列(如图片)时。
您希望将BLOB列放在单独的表中,不仅可以更快地查询用户表,还因为可以将包含blob的表移动到便宜,慢速存储的其他表空间中,从而将查询最多的数据保留在表中。主表空间上的存储速度更快。
只有当您希望表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;
在业务建模中,逻辑上与业务角度分离的两个实体A和B通常映射到不同的表。
例如,在使用面向对象的方式进行业务建模时,通常会使用某种对象关系映射。您可以从对象模型开始,然后从中获取关系模型。因此,请想象在您的对象模型中创建了类A和B,尽管它们具有1:1对应关系,但由于单一责任原则,它们应该保持分离。请注意,在对象模型中,这些类不仅仅是具有属性的表,它们还可以表示业务对象,并且在方法中实现了某些行为。现在,当您将这些类直接映射到关系模型时,您将获得具有1:1关系的单独的表A和B。
以我的经验,在创建业务或OO数据模型时,这种逻辑上的分离对于1:1关系而言要比“物理”原因(例如性能,个人安全性或分区)更为典型。