一对多到多表

v1d*_*dar 2 database-design sql-server

设计表 A 中的每个条目都连接(1:n)到表 B 或表 C 中的条目的关系的正常方法是什么?

或者特别是:有一个用于角色、电影、剧集和电视节目季的表格。一个角色与 1) 电影或 2) 节目有关(除了 n:n 与季节(季节常规)和剧集之外)

x 可以是电影和节目的 ID。

两个相同的表(tv_characters 和 movie_characters)?

使用两个主键会更好吗(一个总是“电影”或“电视”)?

Han*_*non 5

使用交叉引用表将字符链接到媒体,如下所示:

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)

在此处输入图片说明