SQL电影表设计&询问

时间:2015-03-31 12:55:06

标签: sql sql-server database

我应该首先说我对SQL和数据库相当新。我阅读了很多内容,并且缩小了我的数据库设计和问题。我现在试着解释一下。

所以我正在尝试构建'典型'电影/电影数据库(用于SQL服务器)。

每部电影都有很多演员,每个演员都可以参演很多电影。 导演和流派也一样。 (与dbo.Films的多对多关系)

电影也有日期和预算被视为一对一的关系(我把它们放在dbo.Films中)。

演员可以拥有1个fname,1个lname和0个或更多个电子邮件地址。 董事有1个fname和1个lname。 您可以在下图中看到我的设计(PK是主键)。

See my db_design

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

2 个答案:

答案 0 :(得分:1)

  1. 除了一个例外,设计对我来说似乎很好。然而,我宁愿有一张表dbo.Person或类似的东西,因为演员和导演都分享一些漂亮的人物属性(例如名字)。那些同样指导和反过来的演员呢?您不希望有两个数据库条目。
  2. 关于'dbo.Emails'表,我没有看到任何问题。我希望与上述人员表有一对多的关系。因此,该表可能有一个'Id'列,一个'PersonsId'和电子邮件本身。
  3. 只需使用JOIN语句,您将无法检索一行中的所有信息,因为JOIN将为两个结果集的每个匹配组合提供一行。因此,由十位演员主演的电影将导致十行。如果那部电影属于两种类型,你最终会有二十行,依此类推。有一些方法可以在一列中获取actor的所有名称(例如逗号分隔),但通常这不是人们想要的。但这取决于您的应用程序或用例。

答案 1 :(得分:1)

这确实是一个很大的话题。有关于数据库规范化的全书。

  1. Genres(ID(PK), Name)没问题。
  2. Films(ID(PK), Title, Date, Budget)没问题
  3. 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的单一性。我想你明白为什么。

  4. ActorsDirectors。在这里你可以添加 Persons(ID(PK), FirstName, LastName)并将此表格与Actors(PersonID(PK,FK), ...)Directors(PersonID(PK,FK), ...)

  5. 相关联
  6. FilmActors(FilmID, ActorID) - 这里你应用了子弹3。

  7. FilmDirectors(FilmID, DirectorID) - 这里你应用了子弹3。

  8. 添加PersonEmails(PersonID, EmailID) - 在这里您应用项目符号3.

  9. 子弹4,5,6可以改变:

    1. PersonTypes(ID(PK), Name):导演,演员,制片人......

      Persons(ID(PK), FirstName, LastName)

      PersonTypesPersons(PersonID, PersonTypeID) - 在这里你应用了子弹3.

    2. FilmActors - 不再需要了。

    3. FilmDirectors - 不再需要了。

    4. 添加PersonEmails(PersonID, EmailID) - 在这里您应用项目符号3.