我试图让这个令人难以置信的东西,他们称之为数据库设计没有太大的成功,所以我将尝试通过一个例子说明我的问题.
我正在使用MySQL,这是我的问题:
假设我想创建一个数据库来保存我的DVD集合.我有以下要包含的信息:
片名
演员
运行时间
类型
描述
年
导向器
我想在这些之间建立关系,使其更有效但不知道如何.
这是我正在考虑的数据库设计:
电影表=> filmid,filmtitle,运行时间,描述
年表=>年
流派表=>流派
导演表=>导演
Actors Table => actor_name
但是,我将如何创建这些表之间的关系?
另外,我为Films Table创建了一个唯一的ID,主键自动递增,我是否需要为每个表创建一个唯一的ID?
最后,如果我要通过PHP表单将新电影更新到数据库中,我将如何插入所有这些数据(与关系和所有?)
感谢你能给予的任何帮助,基思
您必须区分属性和实体.实体是一种东西 - 通常是名词.属性更像是一段描述信息.在数据库术语中,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表.
一旦设置完成,就很容易查询和查找某个人所做的一切,或者一个人作为导演所做的一切,或者曾经执导过电影的所有人,或者所有参与某个特定电影的人.它可以继续下去.
以下内容不是实际的MySQL代码.看起来你需要的更多是概念性的开始.所以这是一个数据库应该是什么样的模型.
id(主键)
名字
姓
等(你想要存储在演员身上的任何其他列)
ID
名字
姓
等等
ID
名称
等等
ID
标题
描述
运行时间
发布日期
导演ID - 这是一个外键,指的是指导电影的导演的id(主键)
流派身份 - 就像导演身份,这是指电影属于的流派的身份
电影ID - 这是一个外键,指的是电影的身份
actor id - 这是一个外键,指的是电影中一个演员的id.
对于电影中的每个演员,你都会在演员电影指数中添加一行.因此,如果演员5和13(这些演员的主键)出演电影4(同样是该电影的主键),你的索引中会有两行反映这一事实:一个电影ID = 4,和演员id = 5,另一个电影id = 4,演员id = 13.
希望有所帮助.
此外,这假设每部电影只有一个导演.如果您图书馆中的任何一部电影有两位导演(如贫民窟的百万富翁),您需要将导演ID从电影表中分离出来,并创建一个导演电影指数,如上面的演员电影指数.
这些是我使用的表格:
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_
使用了我要使用的主键.