1

我有一张代表足球比赛的表格:

  • 日期
  • 对手

我觉得 {Date,Opponent} 是主键,因为在这张表中,每个日期永远不会有超过一个对手。问题是当我在其他表中创建外键约束时,我必须在其他表中同时包含 Date 和 Opponent 列:

足球比赛统计表:

  • 日期
  • 对手
  • 事件(进球、黄牌等)

理想情况下,我希望拥有:

足球比赛表:

  • ID
  • 日期
  • 对手

足球比赛统计表:

  • 足球比赛ID
  • 事件(进球、黄牌等)

其中 SoccerMatch.ID 是唯一 ID(但不是主键), {Date,Opponent} 仍然是主键。

问题是 SQL Server 似乎不允许我将 ID 定义为唯一标识,而 {Date,Component} 是主键。当我转到 ID 的属性时,信号唯一标识的部分以“否”显示为灰色。

(我假设每个人都同意我应该尝试实现上述目标,因为它是一个更好的设计?)

4

1 回答 1

1

我认为大多数人不会使用图形设计器来执行此操作,因为阻止它的是图形设计器,而不是 SQL Server。尝试在查询窗口中运行 DDL:

ALTER TABLE dbo.YourTable ADD ID INT IDENTITY(1,1);
GO
CREATE UNIQUE INDEX yt_id ON dbo.YourTable(ID);
GO

现在您可以在其他表中引用此列没有问题:

CREATE TABLE dbo.SomeOtherTable
(
  MatchID INT FOREIGN KEY REFERENCES dbo.YourTable(ID)
);

也就是说,我发现列名ID完全没用。如果它是 a MatchID,为什么不在MatchID模式中出现的任何地方调用它呢?是的,它在 PK 表中是多余的,但恕我直言,整个模型的一致性更为重要。

就此而言,为什么你的桌子被称为SoccerMatch?你有其他类型的比赛吗?我认为它将Matches具有唯一的 ID = MatchID。这样,如果您以后有不同类型的比赛,您不必为每项运动创建一个新表 - 只需添加type某种类型的列。如果你只踢过足球,那SoccerMatch有点多余,不是吗?

另外我建议键和唯一索引是相反的。如果您不打算将多列键用于外部引用,那么至少对我而言,让 PK 成为您在其他表中引用的内容更为直观。所以我想说:

CREATE TABLE dbo.Matches
(
  MatchID INT IDENTITY(1,1),
  EventDate DATE, -- Date is also a terrible name and it's reserved
  Opponent <? data type ?> / FK reference?
);

ALTER TABLE dbo.Matches ADD CONSTRAINT PK_Matches
  PRIMARY KEY (MatchID);

ALTER TABLE dbo.Matches ADD CONSTRAINT UQ_Date_Opponent
  UNIQUE (EventDate, Opponent);
于 2013-01-27T17:20:24.363 回答