说我有这样的结构:
运动:
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}参考。
但这看起来不正确。这是最好的方法吗?
答案 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)
你是否试图给出一项运动的名称,以便数据库显示详细信息(持续时间,比赛场地类型,球员数量等)?