我已经阅读了几篇关于创建一对一关系的帖子:
但我很乐意听取您对这个基本案例的建议:我有一个 USER 和一个 COMPANY 表。每个用户可以有 0 或 1 个公司。
使用具有以下关系的两个表是否更好:
还是我只需要使用一个包含所有所需字段的表:
谢谢你的解释。
注意:我正在使用 SQL Server(使用 Manager Studio 进行设置)并计划使用 EF。
更新:为了更明确,我想要实现的是:用户可以拥有或不拥有公司。如果他拥有一家公司,他是唯一为该公司工作的人。
谢谢
我已经阅读了几篇关于创建一对一关系的帖子:
但我很乐意听取您对这个基本案例的建议:我有一个 USER 和一个 COMPANY 表。每个用户可以有 0 或 1 个公司。
使用具有以下关系的两个表是否更好:
还是我只需要使用一个包含所有所需字段的表:
谢谢你的解释。
注意:我正在使用 SQL Server(使用 Manager Studio 进行设置)并计划使用 EF。
更新:为了更明确,我想要实现的是:用户可以拥有或不拥有公司。如果他拥有一家公司,他是唯一为该公司工作的人。
谢谢
由于用户可能不拥有公司,因此这不是真正的“一对一”关系。
实际上,这是“1 到 0..1”,您可以通过以下两种方式之一对其进行建模:
把所有东西都放在一张桌子上:
请注意 COMPANY_ID 如何既是 UNIQUE(防止多个用户拥有同一家公司)又是 NULL-able(允许不拥有公司的用户)。USER_ID 和 COMPANY_ID 的分离允许公司级外键(即允许子表引用公司,同时防止它们引用无公司用户)。
如果没有公司级 FK,则可以完全省略 COMPANY_ID。
您还需要一个 CHECK 以确保不能设置其他公司字段,除非设置了 COMPANY_ID(或至少公司字段的正确子集不为 NULL)。
有两张桌子:
我们不能只让这两个表的 PK 也成为 FK(在两个方向上),因为 MS SQL Server 不支持在插入新数据时解决鸡与蛋问题所需的延迟约束,它也不支持正确建模“1 到 0..1”关系(它将建模“1 到 1”并且不允许无公司用户)。
您应该选择这两种策略中的哪一种,很大程度上取决于与用户相比的公司数量:
这对我来说实际上听起来像是多对多的关系:
也许你不想考虑后一种情况,但我不会受伤。在这种情况下,您将有一个user
表、一个user_company
表(n 到 n 映射)和一个company
表。如果要将用户限制为一家公司,请使表user_id
中的列user_company
唯一。
希望这会有所帮助。
这取决于您将拥有哪些其他数据。如果这是唯一使用公司的地方,那么就在一张桌子上找它。如果公司在其他几个表中使用,那么您希望它是一个单独的表。
你的第一个选择是最好的。
有一百万个理由……但这里有 5 或 6 个需要考虑/让你开始。
嗯,如果您可能没有要求每个用户拥有一家以上的公司,并且大部分用户都会拥有一家公司,并且没有那么多领域来描述一家公司,那么我会保持简单并使用一张表. 您以后可以随时改变主意。
如果您想要更多的范围 1 到多个,那么您将 userid 放入 company 或 companyid 放入 user,您所拥有的选项 1 将不起作用,并且还会导致令人难以置信的混乱代码。
Select Company From Companies Where CompanyID = @UserID;// huh eh? What!!
正如其他人所说,如果您想要更大的范围以便可以进行多对多操作,则需要包含 CompanyID 和 UserID 的第三张表。