我应该首先说我对SQL和数据库相当新。我阅读了很多内容,并且缩小了我的数据库设计和问题。我现在试着解释一下。
所以我正在尝试构建'典型'电影/电影数据库(用于SQL服务器)。
每部电影都有很多演员,每个演员都可以参演很多电影。 导演和流派也一样。 (与dbo.Films的多对多关系)
电影也有日期和预算被视为一对一的关系(我把它们放在dbo.Films中)。
演员可以拥有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
答案 0 :(得分:1)
dbo.Person
或类似的东西,因为演员和导演都分享一些漂亮的人物属性(例如名字)。那些同样指导和反过来的演员呢?您不希望有两个数据库条目。JOIN
语句,您将无法检索一行中的所有信息,因为JOIN
将为两个结果集的每个匹配组合提供一行。因此,由十位演员主演的电影将导致十行。如果那部电影属于两种类型,你最终会有二十行,依此类推。有一些方法可以在一列中获取actor的所有名称(例如逗号分隔),但通常这不是人们想要的。但这取决于您的应用程序或用例。答案 1 :(得分:1)
这确实是一个很大的话题。有关于数据库规范化的全书。
Genres(ID(PK), Name)
没问题。Films(ID(PK), Title, Date, Budget)
没问题 FilmGenres(FilmID, GenreID)
您可以在此处执行以下操作
一个。添加复合PK FilmGenres(FilmID(PK), GenreID(PK))
湾添加代理PK FilmGenres(ID(PK), FilmID, GenreID)
以及FilmID,GenreID FilmGenres(ID(PK), FilmID(U), GenreID(U))
上的唯一索引。
在这里,您需要组合FilmID和GenreID的单一性。我想你明白为什么。
Actors
和Directors
。在这里你可以添加
Persons(ID(PK), FirstName, LastName)
并将此表格与Actors(PersonID(PK,FK), ...)
和Directors(PersonID(PK,FK), ...)
FilmActors(FilmID, ActorID)
- 这里你应用了子弹3。
FilmDirectors(FilmID, DirectorID)
- 这里你应用了子弹3。
添加PersonEmails(PersonID, EmailID)
- 在这里您应用项目符号3.
子弹4,5,6可以改变:
PersonTypes(ID(PK), Name)
:导演,演员,制片人......
Persons(ID(PK), FirstName, LastName)
PersonTypesPersons(PersonID, PersonTypeID)
- 在这里你应用了子弹3.
FilmActors
- 不再需要了。
FilmDirectors
- 不再需要了。
添加PersonEmails(PersonID, EmailID)
- 在这里您应用项目符号3.