外键引用了许多表中的一个

时间:2014-10-19 12:59:08

标签: sql sql-server

说我有这样的结构:

运动

reference int identity not null, primary key (ID),
Duration int, --e.g. football is 90 minutes
Players int,
SportID int,
SportType int --0 for football and 1 for tennis

网球

Reference int IDENTITY NOT NULL,
TurfType int,
-- + more fields related to Tennis

足球

Reference int IDENTITY NOT NULL,
-- + more fields related to Football

Sport.SportID引用网球或足球或体操等。我能想到这样做的唯一方法是在SportType表格中Sport说出哪个表{{1}参考。

但这看起来不正确。这是最好的方法吗?

3 个答案:

答案 0 :(得分:2)

拥有SportType列是合理的。您可以使用以下结构来处理此问题:

create table Sports (
    SportsId int identity not null, primary key (ID),
    Duration int, --e.g. football is 90 minutes
    Players int,
    SportType varchar(10),
    SportId int,
    check (SportType in ('Football', 'Tennis'),
    FootballId as (case when SportType = 'Football' then SportId end),
    TennisId as (case when SportType = 'Tennis' then SportId end),
    foreign key (FootballId) references Football(FootballId),
    foreign key (Tennis) references Tennis(Tennis)
);

请注意,这会使用计算列作为外键引用,以确保参照完整性。

答案 1 :(得分:1)

{Sport}和{Tennis / Fotball}之间有一个"is-a relationship"。在这种情况下," Sport"代表超级和网球/足球是子类。使用面向对象的编程语言,可以使用继承来完成此设计。

  

Sport.SportID引用网球或足球或体操等

这意味着这种关系是排他性的。

在T-SQL中,由于没有继承,一个解决方案实现独占的is-a关系是使用Type列和复合FK({{1}如下:

FOREIGN KEY (SportID, Type)

答案 2 :(得分:0)

你是否试图给出一项运动的名称,以便数据库显示详细信息(持续时间,比赛场地类型,球员数量等)?