规范化问题

Cra*_*rse 1 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
Run Code Online (Sandbox Code Playgroud)

哪里......

  • film_year和film_name识别一部电影.
  • Cinemas_debut是一个多值属性.
  • critic_id - > critic_name
  • film_year,film_name,critic_id - >得分

我无法将关系转换为3FN.这是我试过的:

  • 步骤1

到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
Run Code Online (Sandbox Code Playgroud)
  • 第2步

至2NF:

我认为critics关系 critics ( critic_id (pk), critic_name ) 也是reviews关系,reviews(film_year (pk), film_name (pk), critic_id (pk), score) 但我不知道如何处理结果关系:

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                 
Run Code Online (Sandbox Code Playgroud)

我的做法有什么问题?有人可以将此关系翻译为3FN吗?谢谢.

Tar*_*ryn 7

我的建议是使用以下内容:

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

create table critics
(
  critic_id int,
  critic_name varchar(50)
);
Run Code Online (Sandbox Code Playgroud)

在创建表后的filmscritics创造两者之间的连接表

create table film_critic
(
  film_id int,
  critic_id int,
  score int
);
Run Code Online (Sandbox Code Playgroud)

然后获取位置,为主要城市/地点创建一个表格

create table premiere_locations
(
  location_id int,
  location_name varchar(50)
);
Run Code Online (Sandbox Code Playgroud)

最后在电影和城市之间创建一个连接表

create table film_location
(
  film_id int,
  location_id int
);
Run Code Online (Sandbox Code Playgroud)

然后查询您将使用的数据:

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
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo