设计1或2个表,与SQL Server建立1到(0..1)的关系

时间:2012-08-23 20:17:41

标签: sql-server database-design one-to-one

我已经阅读了几篇关于创建一对一关系的帖子:

how do i create a real one-to-one relationship in sql server

is there ever a time where using a database 11 relationship makes sense?

Database design 1 to 1 relationship

但我很乐意就这个基本案例提出建议:我有一个USER和一个COMPANY表。每个USER可以有0或1个公司。

使用具有以下关系的两个表是否更好:

USER_COMPANY

RELATIONSHIP

或者我只需要使用一个包含所有需要的字段的表:

USER

感谢您的解释。

注意:我正在使用SQL Server(使用Manager Studio进行设置)并计划使用EF。

更新:为了更明确,我想要实现的目标如下: 用户可以拥有或不拥有公司。如果他拥有一家公司,那么他就是唯一为此工作的人。

由于

5 个答案:

答案 0 :(得分:2)

由于用户可能拥有公司,因此这不是真正的" 1对1"关系。

事实上,这是" 1到0..1",您可以通过以下两种方式之一对其进行建模:

  1. 将所有内容都放在一个表格中:

    enter image description here

    请注意,COMPANY_ID如何既独特(防止多个用户拥有同一家公司)又能使用NULL(允许不拥有公司的用户)。 USER_ID和COMPANY_ID的分离允许公司级外键(即允许子表引用公司,同时阻止它们引用无公司用户)。

    如果没有公司级别的FK,您可以完全省略COMPANY_ID。

    除非设置了COMPANY_ID(或者至少公司字段的正确子集是非NULL),否则您还需要检查以确保不能设置其他公司字段。

  2. 有两张桌子:

    enter image description here

    我们不能让这两个表的PK也是FK(在两个方向上),因为MS SQL Server不支持解决鸡与蛋问题所需的延迟约束。插入新数据,也不会正确建模" 1到0..1"关系(它会模拟" 1到1"并且不允许没有公司的用户)。

  3. 您应该选择以下两种策略中的哪一种在很大程度上取决于与用户相比的公司数量:

    • 如果大多数用户拥有公司,请选择(1)。
    • 如果用户数量多于公司,请选择(2)。

答案 1 :(得分:1)

这实际上听起来像是我与多对多的关系:

  • 多个用户可以为公司工作
  • 用户可以为多家公司工作

也许你不想考虑后一种情况,但我不能伤害。在这种情况下,您将拥有user表,user_company表(n-to-n映射)和company表。如果您想将用户限制为一家公司,请将user_id表格中的user_company列设为唯一。

希望这有帮助。

答案 2 :(得分:0)

这取决于您将拥有的其他数据。如果这是唯一使用公司的地方,那么请在一张桌子中找到它。如果公司在其他几个表中使用,那么你可能希望将它作为一个单独的表。

答案 3 :(得分:0)

你的第一个选择是最好的。

  • 索引... ...性能
  • 如果用户不是公司......
  • 如果您想要查询用户 没有带回公司......
  • ......反之亦然
  • 如果您有其他表需要链接到用户,而不是公司......
  • 如果您希望能够以不同方式保护表格 (也许您的采购部门需要SELECT访问公司, 但不是用户;您的人力资源部门需要访问用户,但不是 公司)...

有一百万个理由......但是这里有5或6个想法/让你开始。

答案 4 :(得分:0)

嗯 如果您不可能要求每个用户拥有多个公司,并且大部分用户将拥有一家公司,并且描述一家公司并不是那么多领域,那么我会保持简单并使用一个表。你可以随时把握你的想法。

如果你想要更多的范围1到多,那么你将userid放在用户的公司或公司ID中,你所拥有的选项1不会起作用,并且会导致令人难以置信的混乱代码。

Select Company From Companies Where CompanyID = @UserID;// huh eh? What!!

正如其他人所说,如果你想要更多范围以便你可以做多对多,那么就需要一个包含CompanyID和UserID的第三个表。