【问题标题】:SQL Server Management Studio - How to model this database constraint in a Database DiagramSQL Server Management Studio - 如何在数据库图中对此数据库约束建模
【发布时间】:2014-01-27 20:52:37
【问题描述】:

我有一个名为 Communications 的表,其中包含用户的联系电话。这可以是家庭、手机或传真号码。我将它们全部存储在一个表中并使用类型列识别它们。 (0 = 家庭,1 = 手机,2 = 传真)。 Communications 表有一个外键 UserId,它映射到我的 Users 表以显示 User 到 Number 的关系。我想有一个约束,以便每个用户最多只能拥有每种类型的数字中的一种。对此进行建模的最佳方法是什么?

我在 SQL Server Manager Studio 2008 中使用数据库图,如果可能的话,我想要一个 GUI 式的答案,而不是 SQL 查询。

【问题讨论】:

  • 我不认为数据库图表有任何方式允许您单击并拖动来创建某种类型的约束。它们旨在显示一般的表集及其关系,而不是数据模型的每个方面。无论如何,听起来你的关系是倒退的——如果用户只能有一种通信类型,为什么用户表没有通信表类型列的外键?
  • @AaronBertrand 我的意思是用户可以拥有每种类型中的一种。所以一个用户最多可以有1部家庭电话、1部手机、1部传真;但不是 2 部家庭电话、5 部手机、10 部传真。它们也可能有 0。另一方面,我将如何使用 SSMS 中的 SQL 查询对这样的约束进行建模?

标签: sql sql-server database-design relational-database constraints


【解决方案1】:

您可以添加一个 NumberType 表,其中包含值 0、1、2 作为 NumberType 列中的主键,并将外键从表 Communications.NumberType 添加到 NumberType.NumberType。这样表通信将只能包含值 0,1,2(或您定义的任何 NumberTypes)。

然后,您将主键(或唯一索引,如果您需要其他主键)添加到列 NumberType 和 UserId 上的 Communications 表中。这样可以确保每个用户只能拥有每种类型的一个号码。

【讨论】:

    【解决方案2】:

    只需使用复合键{UserID, NumberType}


    保持{UserID, PhoneNo} 唯一并确保电话号码仅属于一种类型也是一个好主意;同时允许多个用户拥有相同的电话号码,例如家庭电话。在这种情况下,您可以尝试这样的事情

    注意:实现AK(备用键)作为唯一索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      相关资源
      最近更新 更多