首先,我要说我对SQL和数据库还很陌生。 我读了很多书,并缩小了数据库设计和问题的范围。 我现在尝试解释。

因此,我正在尝试构建“典型”电影/电影数据库(用于SQL Server)。

每部电影可以有很多演员,并且每位演员都可以参加许多电影。 导演和类型也一样。 (与dbo.Films的多对多关系)

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

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

见我的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

#1楼 票数:1

  1. 除了一个例外,该设计对我而言似乎不错。 但是,我宁愿有一个表dbo.Person或类似的表,因为演员和导演都共享一些漂亮的个人属性(例如名称)。 那么,那些也直接导演的演员又如何呢? 您将不需要两个数据库条目。
  2. 关于“ dbo.Emails”表,我看不到任何问题。 我希望与上述人员表建立一对多关系。 因此,该表中可能会有一个“ Id”列,一个“ PersonId”和电子邮件本身。
  3. 简单地使用JOIN语句,您将无法检索一行中的所有信息,因为JOIN将为两个结果集的每个匹配组合提供一行。 因此,由十个演员主演的电影将排成十排。 如果该电影属于两种类型,您将得到二十行,依此类推。 有多种方法可以将参与者的所有名称都放在一列(例如,用逗号分隔)中,但是通常这不是人们想要的。 但是,这取决于您的应用程序或用例。

#2楼 票数:1

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

  1. Genres(ID(PK), Name)是可以的。
  2. Films(ID(PK), Title, Date, Budget)可以
  3. FilmGenres(FilmID, GenreID)在这里您可以执行以下操作

    一种。 添加复合PK FilmGenres(FilmID(PK), GenreID(PK))

    b。 添加代理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. FilmActors(FilmID, ActorID) -在这里应用项目符号3。

  6. FilmDirectors(FilmID, DirectorID) -在这里应用项目符号3。

  7. 添加PersonEmails(PersonID, EmailID) -在此处应用项目符号3。

如果满足以下条件,则第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。

  ask by Tsafou translate from so

未解决问题?本站智能推荐:

5回复

SQL表性能设计

我正在为网站设计一个数据库,在该数据库中,性能是最重要的。 关键功能基于两个表。 并且这些表具有多对多关系。 为了对此进行拆分,我添加了一个额外的表Table1_Table2,该表然后按关系保存两个表主键的组合。 例如,我所有的汽车都放在汽车表中,我所有的颜色都在颜色表中
3回复

表的条件sql查询

我必须从SQL运行查询。 也许太容易或不容易,但不幸的是我不懂SQL。 所以这是我的表: 影片 名 films_cast 我怎样才能从这些表中得出这样的结论: film_archive 谢谢!
1回复

SQL查询数据透视表

表格如下: 角色 宾语 允许 RoleObjectPermission Role.Id = 1的所需查询结果: 我尝试遵循此站点以及此SO问题 ,但是这些示例仅适用于将动态行旋转到列而将静态列旋转到行。 该查询一次只能用于一个角色。 我需要查
1回复

SQL查询动态表的转置

sql表如下, 它包含大约1000行。 我需要对该表进行转置,以使预期输出为 我尝试在Sql Server 2008中使用Pivot和Unpivot函数。 但是由于Name记录很大,所以Pivot查询没有帮助。 我的SQL尝试如下
1回复

SQL一对多关系表设计的正确方法

剧情:我需要预订一个依赖于3种不同类型的工厂的订单。 我有用于订单和工厂的单独表格。 现在,我需要在Order和Booking Factory之间建立一对多的关系。 订单表: 工厂表: 样品订单数据 样本工厂数据 现在,一个订单依赖于多个服装,印
3回复

SQL电影数据库图

我在一个小型学校项目中工作,在该项目中我用SQL创建了电影数据库。 我已经创建了表,并且想知道我创建的模型是否会遇到任何问题。 提前致谢。 当前图 编辑: 这是新图
3回复

SQL-在四个表之间查询

我的查询有问题。 表Pilot 表季节 表国家 餐桌灯 表Pilot与季节和国家相关联。 表格电路与国家相关联。 我想为每个飞行员显示每一行中的最后一个和第一个电路,但问题是我有重复的结果。 第一个结果显示我第一个电路,副本显示我的最后一个电路。
2回复

SQL查询组合两个表

假设我有两个桌子 表格1: 表2: 我想合并这两个表。 结果将是这样的: 我该怎么做?