1

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

如何在 sql server 中创建真正的一对一关系

是否曾经有过使用数据库 11 关系有意义的时候?

数据库设计1对1关系

但我很乐意听取您对这个基本案例的建议:我有一个 USER 和一个 COMPANY 表。每个用户可以有 0 或 1 个公司。

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

USER_COMPANY

关系

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

用户

谢谢你的解释。

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

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

谢谢

4

5 回答 5

3

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

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

  1. 把所有东西都放在一张桌子上:

    在此处输入图像描述

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

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

    您还需要一个 CHECK 以确保不能设置其他公司字段,除非设置了 COMPANY_ID(或至少公司字段的正确子集不为 NULL)。

  2. 有两张桌子:

    在此处输入图像描述

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

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

  • 如果大多数用户拥有一家公司,请选择 (1)。
  • 如果用户多于公司,请选择 (2)。
于 2012-08-23T21:31:55.320 回答
1

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

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

也许你不想考虑后一种情况,但我不会受伤。在这种情况下,您将有一个user表、一个user_company表(n 到 n 映射)和一个company表。如果要将用户限制为一家公司,请使表user_id中的列user_company唯一。

希望这会有所帮助。

于 2012-08-23T20:25:15.653 回答
0

这取决于您将拥有哪些其他数据。如果这是唯一使用公司的地方,那么就在一张桌子上找它。如果公司在其他几个表中使用,那么您希望它是一个单独的表。

于 2012-08-23T20:24:57.390 回答
0

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

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

有一百万个理由……但这里有 5 或 6 个需要考虑/让你开始。

于 2012-08-23T20:29:54.247 回答
0

嗯,如果您可能没有要求每个用户拥有一家以上的公司,并且大部分用户都会拥有一家公司,并且没有那么多领域来描述一家公司,那么我会保持简单并使用一张表. 您以后可以随时改变主意。

如果您想要更多的范围 1 到多个,那么您将 userid 放入 company 或 companyid 放入 user,您所拥有的选项 1 将不起作用,并且还会导致令人难以置信的混乱代码。

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

正如其他人所说,如果您想要更大的范围以便可以进行多对多操作,则需要包含 CompanyID 和 UserID 的第三张表。

于 2012-08-23T21:45:12.220 回答