Database design 正常化问题

Database design 正常化问题,database-design,normalization,Database Design,Normalization,我试图使这种关系正常化: film_year film_name critic_id critic_name cinemas_debut score 2004 I robot 111 John NY_cinema, LA_cinema 4 2004 I robot 222 Mathiew NY_cinema, LA_cinema 5 film_year fi

我试图使这种关系正常化:

film_year  film_name  critic_id critic_name cinemas_debut           score
     2004  I robot          111        John  NY_cinema, LA_cinema       4 
     2004  I robot          222     Mathiew  NY_cinema, LA_cinema       5
film_year  film_name  critic_id cinemas_debut          
     2004  I robot          111    NY_cinema                   
     2004  I robot          222    LA_cinema                  
     2004  I robot          111    NY_cinema                   
     2004  I robot          222    LA_cinema                 
在哪里

  • 电影年和电影名称标识电影
  • 电影院的首次亮相是一个多变量属性
  • 评论家id->评论家姓名
  • 电影年、电影名、评论家id->评分
我无法将关系转换为3FN。这是我尝试过的:

  • 第一步
至1NF:

film_year  film_name  critic_id critic_name cinemas_debut           score
     2004  I robot          111        John  NY_cinema                  4 
     2004  I robot          222     Mathiew  LA_cinema                  5
     2004  I robot          111        John  NY_cinema                  4 
     2004  I robot          222     Mathiew  LA_cinema                  5
  • 步骤2
至2NF:

我将
批评家
关系识别为
批评家(批评家id(pk)、批评家姓名)
同时
评论
关系为
评论(电影年(pk)、电影名(pk)、评论家id(pk)、分数)
但我不知道如何处理结果关系:

film_year  film_name  critic_id critic_name cinemas_debut           score
     2004  I robot          111        John  NY_cinema, LA_cinema       4 
     2004  I robot          222     Mathiew  NY_cinema, LA_cinema       5
film_year  film_name  critic_id cinemas_debut          
     2004  I robot          111    NY_cinema                   
     2004  I robot          222    LA_cinema                  
     2004  I robot          111    NY_cinema                   
     2004  I robot          222    LA_cinema                 

我的方法有什么问题?有人能把这种关系翻译成3FN吗?谢谢。

我的建议是使用以下方法:

create table films
(
  film_id int,
  film_year int,
  film_name varchar(50)
);

create table critics
(
  critic_id int,
  critic_name varchar(50)
);
电影
评论家
创建表后,在两者之间创建一个联接表

create table film_critic
(
  film_id int,
  critic_id int,
  score int
);
然后,要获取位置,请为主要城市/位置创建一个表

create table premiere_locations
(
  location_id int,
  location_name varchar(50)
);
最后在电影和地点城市之间创建一个连接表

create table film_location
(
  film_id int,
  location_id int
);
然后,要查询您的数据,您将使用:

select f.film_year,
  f.film_name,
  c.critic_id,
  c.critic_name,
  fc.score,
  l.location_name
from films f
left join film_critic fc
  on f.film_id = fc.film_id
left join critics c
  on fc.critic_id = c.critic_id
left join film_location fl
  on f.film_id = fl.film_id
left join premiere_locations l
  on fl.location_id = l.location_id

参见

我的建议是使用以下方法:

create table films
(
  film_id int,
  film_year int,
  film_name varchar(50)
);

create table critics
(
  critic_id int,
  critic_name varchar(50)
);
电影
评论家
创建表后,在两者之间创建一个联接表

create table film_critic
(
  film_id int,
  critic_id int,
  score int
);
然后,要获取位置,请为主要城市/位置创建一个表

create table premiere_locations
(
  location_id int,
  location_name varchar(50)
);
最后在电影和地点城市之间创建一个连接表

create table film_location
(
  film_id int,
  location_id int
);
然后,要查询您的数据,您将使用:

select f.film_year,
  f.film_name,
  c.critic_id,
  c.critic_name,
  fc.score,
  l.location_name
from films f
left join film_critic fc
  on f.film_id = fc.film_id
left join critics c
  on fc.critic_id = c.critic_id
left join film_location fl
  on f.film_id = fl.film_id
left join premiere_locations l
  on fl.location_id = l.location_id

请看

我会以不同的方式建模。根据参数,将有3个实体: -Cinemas(Cinemass\u首次亮相)>>注意,您必须创建主键(即Cinemass\u id) -电影(电影年,电影名称)>>注意,您必须创建主键(即电影id) -评论家(评论家id(PK)、评论家姓名、分数)

现在,这是一个解释的问题。在我看来,影评人与某一特定电影院放映的一部电影有关。因此,我会创建一个协会 -表演(电影院id(FK)、电影id(FK)、评论家id(FK))

这样,您将拥有:

  • 电影院:2张唱片(C1、C2)
  • 电影:1项纪录(F1)
  • 评论家:2名评论家(CR1、CR2)
  • 显示:2条记录(C1-F1-CR1、C2-F1-CR2)
听起来更好吗?
谢尔盖

我会以不同的方式建模。根据参数,将有3个实体: -Cinemas(Cinemass\u首次亮相)>>注意,您必须创建主键(即Cinemass\u id) -电影(电影年,电影名称)>>注意,您必须创建主键(即电影id) -评论家(评论家id(PK)、评论家姓名、分数)

现在,这是一个解释的问题。在我看来,影评人与某一特定电影院放映的一部电影有关。因此,我会创建一个协会 -表演(电影院id(FK)、电影id(FK)、评论家id(FK))

这样,您将拥有:

  • 电影院:2张唱片(C1、C2)
  • 电影:1项纪录(F1)
  • 评论家:2名评论家(CR1、CR2)
  • 显示:2条记录(C1-F1-CR1、C2-F1-CR2)
听起来更好吗? 哔叽

好的

  • 第一个NF-无重复元素或元素组
    您做到了:重复数据消除电影院

  • 第二个NF:对连接键没有部分依赖关系
    换句话说,确保有一个值(两个值)唯一地标识其他属性

评论家(评论家id、评论家姓名、分数)(/*我猜分数是评论家的一部分*/)

Film(Film\u name,Film\u year):您可以使用这两个字段来唯一地标识电影,但它不会是第三个NF->添加PK Film\u id 电影(电影id(FK)、电影名称(FK)、电影年份(FK))

电影院(电影院名称):不在第三个NF->添加PK电影院id 电影院(电影院id、电影院名称) 电影(电影id、电影名称、电影年份)

你需要把一部电影和一家电影院、一位评论家联系起来。根据评论家的背景:

  • 比分取决于电影和电影院 演出(电影院id、电影id、评论家id)

  • 比分只取决于电影 Show(film_id,critist_id),主键是两个外键(标识一对电影院/电影/评论家),并且是第三种正常形式(您不单独处理这三个FK中的任何一个) 电影(电影id(FK)、电影id、电影名称、电影年份)

  • 第三个NF:不依赖于非关键属性 换句话说,请确保没有属性由复杂键的一部分标识。根据系统的唯一复合键,您没有任何属性(仅限备选方案1中的show中的cinema\u id/film\u id/Critical\u id)

听起来清楚吗? 哔叽

好的

  • 第一个NF-无重复元素或元素组
    您做到了:重复数据消除电影院

  • 第二个NF:对连接键没有部分依赖关系
    换句话说,确保有一个值(两个值)唯一地标识其他属性

评论家(评论家id、评论家姓名、分数)(/*我猜分数是评论家的一部分*/)

Film(Film\u name,Film\u year):您可以使用这两个字段来唯一地标识电影,但它不会是第三个NF->添加PK Film\u id 电影(电影id(FK)、电影名称(FK)、电影年份(FK))

电影院(电影院名称):不在第三个NF->添加PK电影院id 电影院(电影院id、电影院名称) 电影(电影id、电影名称、电影年份)

你需要把一部电影和一家电影院、一位评论家联系起来。根据评论家的背景:

  • 比分取决于电影和电影院 演出(电影院id、电影id、评论家id)

  • 比分只取决于电影 Show(film_id,critist_id),主键是两个外键(标识一对电影院/电影/评论家),并且是第三种正常形式(您不单独处理这三个FK中的任何一个) 电影(电影id(FK)、电影id、电影名称、电影年份)

  • 第三个NF:不依赖于非关键属性 换句话说,确保复合体的一部分没有标识任何属性