v1d*_*dar 2 database-design sql-server
设计表 A 中的每个条目都连接(1:n)到表 B 或表 C 中的条目的关系的正常方法是什么?
或者特别是:有一个用于角色、电影、剧集和电视节目季的表格。一个角色与 1) 电影或 2) 节目有关(除了 n:n 与季节(季节常规)和剧集之外)
x 可以是电影和节目的 ID。
两个相同的表(tv_characters 和 movie_characters)?
使用两个主键会更好吗(一个总是“电影”或“电视”)?
使用交叉引用表将字符链接到媒体,如下所示:
CREATE TABLE dbo.Characters
(
CharacterID INT NOT NULL
CONSTRAINT PK_Characters
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, CharacterName VARCHAR(100) NOT NULL
);
CREATE TABLE dbo.MediaTypes
(
MediaTypeID INT NOT NULL
CONSTRAINT PK_MediaTypes
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, MediaTypeName VARCHAR(100) NOT NULL
);
CREATE TABLE dbo.Media
(
MediaID INT NOT NULL
CONSTRAINT PK_Media
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, MediaName VARCHAR(100) NOT NULL
, MediaTypeID INT NOT NULL
CONSTRAINT FK_Media_MediaTypeID
FOREIGN KEY
REFERENCES dbo.MediaTypes(MediaTypeID)
);
CREATE TABLE dbo.CharactersMedia
(
MediaID INT NOT NULL
, CharacterID INT NOT NULL
, CONSTRAINT PK_CharactersMedia
PRIMARY KEY CLUSTERED
(MediaID, CharacterID)
);
INSERT INTO dbo.MediaTypes (MediaTypeName)
VALUES ('TV Show')
, ('Movie');
INSERT INTO dbo.Characters (CharacterName)
VALUES ('Don Juan')
, ('Don Johnson');
INSERT INTO dbo.Media (MediaName, MediaTypeID)
VALUES ('Miami Vice', 1)
, ('Don Juan', 2);
INSERT INTO dbo.CharactersMedia (MediaID, CharacterID)
VALUES (1, 2)
, (2, 1);
SELECT m.MediaName
, c.CharacterName
, mt.MediaTypeName
FROM dbo.Media m
INNER JOIN dbo.CharactersMedia cm ON m.MediaID = cm.MediaID
INNER JOIN dbo.Characters c ON cm.CharacterID = c.CharacterID
INNER JOIN dbo.MediaTypes mt ON m.MediaTypeID = mt.MediaTypeID;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1150 次 |
最近记录: |