首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确构造模式

如何正确构造模式
EN

Stack Overflow用户
提问于 2014-03-06 23:57:59
回答 2查看 97关注 0票数 0

我注册了DBM/BI证书课程(更像是速成班),我决定开始一个独立的项目,以实现我实时学到的一切。长话短说,我将分析数据(boxofficemojo.com)的前130部电影在过去13年(使用MySQL服务器/工作台)。)。首先,我想映射一个模式,然后进行一些数据挖掘/可视化。到目前为止,我是如何把它分开的:

代码语言:javascript
复制
"Movies"
 Movie_ID (Primary )
 Dom_Revenue
 Int_Revenue
 OpWe_Revenue
 Budget


"Rating"
Rating_ID (P)
Rating

"Release"
Release_ID (P)
Year
Month
Day
Movie_ID (F)

"Cast"
Director_Gender (P)
Lead_Gender (P)
Director_Name
Director_Name
Movie_ID (F)

"Studio"
Studio_ID (P)
Studio_Name

到目前为止,这些都是我的关系:

代码语言:javascript
复制
rating to movies - one to many ( many movies can be rated R , a movie can only have 1 rating )
release to movies - one to many ( many movies can be released on the same weekend, a movie can only be released once)
cast to movies - one to many (directors/actors can make many movies, a movie can only have one cast)
studio to movies - many to many (movies can be attached to more than one studio, a studio can make more than one movie)

我知道模式很可能不是100%正确的,所以应该将所有其他表中的主键作为外键包含在“影视”表中吗?我的关系怎么样?

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-07 05:49:35

这与Leo的第一个答案有关,但我会说得更具体一些,并增加更多的观察。

首先,Release属性在功能上依赖于Movie_ID (或一般的电影),因此它不应该是一个单独的Entity

第二,对于第一个版本,您的发布实体中有YearMonthDay,为什么不将其设置为具有YearMonthDay的Release_Date呢?然后,您可以再次将Release属性作为Movie的一部分。

第三,关于第一个,为什么不添加一个Movie_Title字段?

因此,在所有这些内容中,您可以使用以下模式:

代码语言:javascript
复制
"Movies"
Movie_ID (Primary )
Movie_Title
Dom_Revenue
Int_Revenue
OpWe_Revenue
Budget
Release_Date

您可以轻松地查询在特定Year中发布的电影,如:

代码语言:javascript
复制
SELECT Movie_Title, Year(Release_Date) as Release_Year
FROM Movies
WHERE Year(Release_Date) = 2011

或者您也可以通过Year (或Month)来计算它。

代码语言:javascript
复制
SELECT Year(Release_Date) as Release_Year, COUNT(*) Number_of_Movies_in_a_Year
FROM Movies
GROUP BY Year(Release_Date)
ORDER BY Year(Release_Date)

第四,在你的Cast实体中,你说过“导演/演员可以拍很多电影,一部电影只能有一个演员”。但是看看您的Cast,您有一个Movie属性,它是来自MoviesFK (外键),这意味着Movie可以有很多Cast,因为FK总是在多个方面。此外,这个实体几乎是对4NF (第四范式)的违反。因此,最好的方法可能是在Cast表中进行专门化,并将其与Movies表相关联,以便它具有One-to-Many关系,或者CastDirector可以有很多电影。所以,看起来是这样:

代码语言:javascript
复制
 "Cast"
 Cast_ID (PK)
 Cast_Name
 Cast_Gender
 Cast_Type (values here could either be Director or Lead or could be simply letters like D or L)

您的Movies表现在可以更改为如下:

代码语言:javascript
复制
"Movies"
Movie_ID (Primary )
Movie_Title
Dom_Revenue
Int_Revenue
OpWe_Revenue
Budget
Release_Date
Lead_ID (FK)
Cast_ID (FK)

最后,你说“电影可以连在一个以上的工作室,一个工作室可以制作多部电影”。Many-to-many关系通常有一个bridge table来创建实体之间的many-to-many关系。因此,假设您有一个Studio_Movie实体/表作为桥接表,那么您将有如下所示:

代码语言:javascript
复制
"Studio_Movie"
Studio_ID (PK, FK1)
Movie_ID (PK, FK2)
票数 0
EN

Stack Overflow用户

发布于 2014-03-07 00:37:24

对我来说没问题。

我只是觉得“发布”这个实体可能有点过火了(知道什么电影同时上映有什么用?)所以我认为它可以是一组电影属性。

还有你的“演员”实体有两个董事。也许你可以正常化,只保留一个导演(因为电影1<->N导演,这只是一个增加关系的问题)。

关于FKs,是的,你应该加进去。你们的关系很好。

祝好运。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22238752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档