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->评分
- 第一步
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
批评家
关系识别为批评家(批评家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、电影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、电影id、评论家id)
- 比分只取决于电影 Show(film_id,critist_id),主键是两个外键(标识一对电影院/电影/评论家),并且是第三种正常形式(您不单独处理这三个FK中的任何一个) 电影(电影id(FK)、电影id、电影名称、电影年份)
- 第三个NF:不依赖于非关键属性 换句话说,确保复合体的一部分没有标识任何属性