【发布时间】:2015-03-31 12:55:05
【问题描述】:
首先我应该说我对 SQL 和数据库还很陌生。我读了很多书,并且缩小了我的数据库设计和问题的范围。我现在试着解释一下。
所以我正在尝试构建“典型”电影/电影数据库(用于 SQL 服务器)。
每部电影可以有很多演员,每个演员都可以参演很多电影。 导演和流派也是如此。 (与 dbo.Films 的多对多关系)
电影还具有被视为一对一关系的日期和预算(我将它们放在 dbo.Films 中)。
Actor 可以有 1 个 fname、1 个 lname 和 0 个或多个电子邮件地址。 董事有 1 个 fname 和 1 个 lname。 你可以在下图中看到我的设计(PK是主键)。
1) 到目前为止,我的设计和思维方式如何?
2) 我应该如何设计 dbo.Emails 表?如果我没记错的话,这与演员是一对多的关系。
3) 假设我想获取一部电影的所有信息(标题、日期、预算、演员、导演、流派),所有信息都在一行/一行中。我想我必须使用 INNER JOIN。我尝试了以下方法,但我得到了多行相同的演员但不同的类型(实际上我认为我得到了所有可能的组合)。我使用 Temp 只是为了从结果中删除 (film) id 列。是不是太复杂了,还是我遗漏了什么?
IF OBJECT_ID('dbo.Temp', 'U') IS NOT NULL
DROP TABLE dbo.Temp
SELECT f.*, a.fname, a.lname, g.name INTO Temp
FROM [Video].[dbo].[films] f
INNER JOIN [Video].[dbo].[film_actor] af
ON f.id = af.film_id
INNER JOIN [Video].[dbo].[actors] a
ON af.actor_id = a.id
INNER JOIN [Video].[dbo].[film_genre] gf
ON f.id = gf.film_id
INNER JOIN [Video].[dbo].[genres] g
ON g.id = gf.genre_id
WHERE f.title = 'SomeMovie'
ALTER TABLE Temp
DROP COLUMN id
/* Get results and drop temp table */
SELECT * FROM Temp
DROP TABLE Temp
【问题讨论】:
-
你正在以关系的方式思考。不用担心。您的数据库看起来不错。您可以添加 ActorEmails(ID、ActorID、Email)。还要在 Film_Genres、Film_Actors 和 Film_Directors 中添加 PK。
-
1) 我应该为 Film_Genre 中的 film_id 和genre_id 添加 PK 吗? Film_Actors 和 Film_Directors 呢?这里PK的目的是什么? 2)您能否更具体地了解 .Persons 表?如果我添加 .Persons 并有 id、fname、lname、电子邮件,我将如何分辨谁是演员和谁是导演?
标签: sql sql-server database