当前位置:  开发笔记 > 编程语言 > 正文

如何设计电影数据库?

如何解决《如何设计电影数据库?》经验,为你挑选了3个好方法。

我试图让这个令人难以置信的东西,他们称之为数据库设计没有太大的成功,所以我将尝试通过一个例子说明我的问题.

我正在使用MySQL,这是我的问题:

假设我想创建一个数据库来保存我的DVD集合.我有以下要包含的信息:

    片名

    演员

    运行时间

    类型

    描述

    导向器

我想在这些之间建立关系,使其更有效但不知道如何.

这是我正在考虑的数据库设计:

电影表=> filmid,filmtitle,运行时间,描述

年表=>年

流派表=>流派

导演表=>导演

Actors Table => actor_name

但是,我将如何创建这些表之间的关系?

另外,我为Films Table创建了一个唯一的ID,主键自动递增,我是否需要为每个表创建一个唯一的ID?

最后,如果我要通过PHP表单将新电影更新到数据库中,我将如何插入所有这些数据(与关系和所有?)

感谢你能给予的任何帮助,基思



1> gregmac..:

您必须区分属性和实体.实体是一种东西 - 通常是名词.属性更像是一段描述信息.在数据库术语中,entity = table,attribute = field/column.

对于某些事情有一个单独的表,让我们使用director作为一个例子称为规范化.虽然在某些情况下它可能是好的,但在其他情况下它可能是不必要的(通常它会使查询更复杂 - 你必须加入所有东西 - 而且它更慢).

在这种情况下,不需要年份表,因为除了年份本身之外,没有其他属性可以存储.最好对其进行非规范化并将年份存储在电影表本身中.

另一方面,主任则不同.也许你想要存储导演的名字,姓氏,出生日期,死亡日期(如果适用)等.你显然不希望每次你输入这个人的电影时输入导演的出生日期指示,所以为导演设立一个单独的实体是有意义的.

即使你不想存储关于导演的所有这些信息(你只想要他们的名字),为它设置一个单独的表(并使用代理键 - 我会在一秒内得到它)是有用的,因为它防止印刷错误和重复 - 如果你的某个人的名字拼写错误或输入不同(首先,最后一个,最后一个,第一个),那么如果你试图找到他们指导的其他电影,你就会失败.

使用表的代理键(主键)通常是个好主意.匹配整数比匹配字符串快得多.它还允许您自由更改名称,而无需担心存储在其他表中的外键(ID保持不变,因此您无需执行任何操作).


你真的可以把这个设计放在相当远的地方,而这一切都需要弄清楚你想要在它里面存储什么.

例如,不是每部电影都有一个导演,有些电影有多个导演......所以电影和导演之间会有多对多的关系,所以你需要一个表格,例如:

films_directors => **filmid, directorid**

更进一步,有时导演也是演员,反之亦然.因此,除了导演和演员表之外,您还可以使用单人表,并使用角色表加入该表.角色表将保持不同的位置 - 例如,导演,制作人,明星,额外,抓地力,编辑......它看起来更像是:

films => **filmid**, title, otherstuff...
people => **personid**, name, ....
roles => **roleid**, role name, ....
film_people => **filmid, personid, roleid**
genre => **genreid**, name, ...
film_genre => **genreid, filmid**

您可能还在film_people表中有一个role_details字段,该字段可能包含取决于角色的额外信息(例如,演员正在播放的部分的名称).

我也将流派展现为许多关系,因为可能有一部电影属于多种类型.如果你不想要这个,那么电影只会包含一个类型,而不是film_genre表.

一旦设置完成,就很容易查询和查找某个人所做的一切,或者一个人作为导演所做的一切,或者曾经执导过电影的所有人,或者所有参与某个特定电影的人.它可以继续下去.


我希望我能两次投票,出色的回应.

2> Matt Howell..:

以下内容不是实际的MySQL代码.看起来你需要的更多是概念性的开始.所以这是一个数据库应该是什么样的模型.

演员表

id(主键)

名字

等(你想要存储在演员身上的任何其他列)

导演表

ID

名字

等等

流派表

ID

名称

等等

电影桌

ID

标题

描述

运行时间

发布日期

导演ID - 这是一个外键,指的是指导电影的导演的id(主键)

流派身份 - 就像导演身份,这是指电影属于的流派的身份

演员电影索引表

电影ID - 这是一个外键,指的是电影的身份

actor id - 这是一个外键,指的是电影中一个演员的id.

对于电影中的每个演员,你都会在演员电影指数中添加一行.因此,如果演员5和13(这些演员的主键)出演电影4(同样是该电影的主键),你的索引中会有两行反映这一事实:一个电影ID = 4,和演员id = 5,另一个电影id = 4,演员id = 13.

希望有所帮助.

此外,这假设每部电影只有一个导演.如果您图书馆中的任何一部电影有两位导演(如贫民窟的百万富翁),您需要将导演ID从电影表中分离出来,并创建一个导演电影指数,如上面的演员电影指数.



3> nickf..:

这些是我使用的表格:

films (_id_, title, runningtime, description)
genres (_id_, name)
people (_id_, name, birthdate, etc...)
roles (_roleid_, rolename)
filmgenres (_filmid_, _genreid_)
castandcrew (_filmid_, _roleid_, _personid_)

没有董事和演员表,只需要一张人.这还可以包括机组成员(如果您想要追踪第二个Junior Assistant Dolly Grip是谁).每部电影可以是任何数量的类型(例如喜剧和恐怖).此外,人们可以在每部电影中扮演任意角色 - 那里有很多演员/导演.

角色表并不一定意味着演员正在演奏的角色,但它可以.它可能是"导演","制片人","演员"......甚至是"卢克天行者",如果你想获得那种细粒度的......我相信IMDB就是这么做的.

希望上面字段的名称应该提示外键,并且我已经_underscores_使用了我要使用的主键.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有