【问题标题】:Foreign Key tables to hold data vs 'inlining' that data within the parent table? Performance?保存数据的外键表与父表中的“内联”数据?表现?
【发布时间】:2020-11-10 09:11:51
【问题描述】:
我很好奇创建一个子表来保存一组数据与首先将所有数据放在主表中相比是否有任何权衡?
我的情况是我有处理各种指标的数据。如 LastUpdated 和 AmtOfXXX。我很好奇将所有这些数据放在一个表中(特别是对于指标)并通过外键引用它,或者将所有这些字段直接放在主表中并放弃任何外键是否会更好?有取舍吗?性能考虑?
我指的是关系数据库管理系统,例如 SQL Server,特别是我将使用 Entity Framework Core 和 MS SQL Server。
【问题讨论】:
标签:
sql
entity-framework
entity-framework-core
foreign-keys
rdbms
【解决方案1】:
您的问题似乎更多地是关于两种方法之间的考虑,而不是询问哪种方法更好。后者更多是一种意见。这解决了前者。
拥有一个 1-1 的单独表的主要优点是将指标与有关实体的其他信息隔离开来。这种类型的数据模型有一个名称,垂直分区(或者至少在我第一次了解它时是这样称呼的)。
这有一定的好处:
- 数据行的宽度更小。因此,只需要“真实”数据(或仅需要指标)的查询会更快。
- 指标是隔离的。因此,添加新指标不需要重写“真实”数据。
-
select * 等对“真实”数据的查询仅返回真实数据。
- 仅修改指标的查询不会锁定“真实”数据。
如果您有很多列并且它们可以放入两个表但不能放入一个表中,也可能会出现边缘情况。
当然有开销:
- 您需要一个
JOIN 来连接这两个表。 (虽然使用相同的主键,连接会很快)。
- 同时修改“真实”数据和指标的查询更加复杂,必须锁定两个表。