首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >标识列与复合主键分离

问标识列与复合主键分离
EN

Stack Overflow用户
提问于 2013-01-27 17:16:41
回答 1查看 2.3K关注 0票数 1

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

  • 日期
  • 对手

我认为{日期,对手}是主键,因为在这个表中,每个日期不可能有一个以上的对手。问题是,当我在其他表中创建外键约束时,必须在其他表中同时包括日期列和对手列:

足球比赛统计表:

  • 日期
  • 对手
  • 项目(进球、黄牌等)

理想情况下,我希望:

足球比赛表:

  • ID
  • 日期
  • 对手

足球比赛统计表:

  • SoccerMatchID
  • 项目(进球、黄牌等)

如果SoccerMatch.ID是唯一的ID (但不是主键)和{Date,则对手}仍然是主键。

问题是Server似乎不允许我将ID定义为唯一标识,而{Date,Component}是主键。当我转到ID的属性时,信号唯一标识的部分是灰色的,上面写着"No“。

(我想每个人都同意我应该努力实现上述目标,因为这是一个更好的设计?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-27 17:20:24

我认为大多数人不使用图形设计器来完成这个任务,因为是图形设计人员阻止了这一点,而不是SQL Server。尝试在查询窗口中运行DDL:

代码语言:javascript
复制
ALTER TABLE dbo.YourTable ADD ID INT IDENTITY(1,1);
GO
CREATE UNIQUE INDEX yt_id ON dbo.YourTable(ID);
GO

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

代码语言:javascript
复制
CREATE TABLE dbo.SomeOtherTable
(
  MatchID INT FOREIGN KEY REFERENCES dbo.YourTable(ID)
);

尽管如此,我发现列名ID完全没用。如果它是一个MatchID,为什么不在模式中的任何地方都叫它MatchID呢?是的,它在PK表中是多余的,但是整个模型的IMHO一致性更重要。

就这一点而言,为什么您的表名为SoccerMatch?还有其他火柴吗?我认为它将是具有唯一ID = MatchID的Matches。这样,如果以后有不同类型的匹配,则不必为每项运动创建一个新表--只需添加某种类型的type列即可。如果你只踢过足球,那么SoccerMatch就有点多余了,不是吗?

此外,我建议关键和独特的指数是相反的。如果您不打算使用多列键作为外部引用,那么至少对我来说,让PK成为其他表中引用的东西更加直观。所以我想说:

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14549934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档