我有一张代表足球比赛的桌子:
我认为{日期,对手}是主键,因为在这个表中,每个日期不可能有一个以上的对手。问题是,当我在其他表中创建外键约束时,必须在其他表中同时包括日期列和对手列:
足球比赛统计表:
理想情况下,我希望:
足球比赛表:
足球比赛统计表:
如果SoccerMatch.ID是唯一的ID (但不是主键)和{Date,则对手}仍然是主键。
问题是Server似乎不允许我将ID定义为唯一标识,而{Date,Component}是主键。当我转到ID的属性时,信号唯一标识的部分是灰色的,上面写着"No“。
(我想每个人都同意我应该努力实现上述目标,因为这是一个更好的设计?)
发布于 2013-01-27 17:20:24
我认为大多数人不使用图形设计器来完成这个任务,因为是图形设计人员阻止了这一点,而不是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完全没用。如果它是一个MatchID,为什么不在模式中的任何地方都叫它MatchID呢?是的,它在PK表中是多余的,但是整个模型的IMHO一致性更重要。
就这一点而言,为什么您的表名为SoccerMatch?还有其他火柴吗?我认为它将是具有唯一ID = MatchID的Matches。这样,如果以后有不同类型的匹配,则不必为每项运动创建一个新表--只需添加某种类型的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);https://stackoverflow.com/questions/14549934
复制相似问题