一尘不染

SQL一对一关系与单个表

sql

考虑如下数据结构,其中用户具有少量固定设置。

用户

[Id] INT IDENTITY NOT NULL,
[Name] NVARCHAR(MAX) NOT NULL,
[Email] VNARCHAR(2034) NOT NULL

用户设置

[SettingA],
[SettingB],
[SettingC]

将用户的设置移动到单独的表中,从而与用户表建立一对一关系是否正确?与将其存储在与用户相同的行中时,这是否具有任何真正的优势(明显的劣势是性能)。


阅读 131

收藏
2021-03-17

共1个答案

一尘不染

当表变得非常宽(即具有许多列)时,通常会将表拆分为两个或多个1:1相关表。对于程序员来说,很难处理具有太多列的表。对于大公司,此类表可以轻松拥有100多个列。

因此,想象一个产品表。有一个售价,也许还有另一个仅用于计算和估计的价格。拥有两个表,一个用于实际值,一个用于计划阶段,这不是很好吗?因此,程序员永远不会混淆这两种价格。或进行产品的物流设置。您想插入产品表中,但是其中具有所有这些逻辑属性,您是否需要设置其中一些?如果是两个表,您将插入到产品表中,而另一个负责后勤数据的程序员将关心物流表。没有更多的混乱。

多列表的另一件事是,具有150列的表的全表扫描当然要比只有一半或更少的表慢。

最后一点是访问权限。使用单独的表,您可以对产品的主表和产品的物流表授予不同的权限。

因此,总而言之,很少见到1:1关系,但是它们可以提供更清晰的数据视图,甚至可以帮助解决性能问题和数据访问。

编辑:我正在接受迈克·谢里尔(Mike Sherrill)的建议,并(希望)澄清有关标准化的问题。

规范化主要是关于避免冗余和相关的一致性缺乏。是否只在一个表中保存数据还是在多个1:1相关表中保存数据的决定与此无关。您可以决定将一个用户表拆分为一个表,以存储个人信息(例如名字和姓氏),以及另一个表以供其学校,毕业和工作使用。由于没有比以前更多或更少的数据,所以两个表都将保持原始表的正常形式。唯一使用过两次的列将是用户ID,但这不是多余的,因为在两个表中都需要用它来标识一条记录。

因此,问“将设置标准化到一个单独的表中是否正确?” 这不是一个有效的问题,因为您无法通过将数据放入与1:1相关的单独表中来规范化任何事情。

2021-03-17