2012-12-03 64 views
1

我試圖正常化這種關係:正常化問題

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標識電影。
  • 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 
  • 步驟2

要2NF:

我鑑定者tify 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     

什麼是錯誤的,我的做法?有人可以將這種關係轉換成3FN嗎?謝謝。

回答

7

我的建議是使用以下命令:在創建表的filmscritics後創建兩個

create table film_critic 
(
    film_id int, 
    critic_id int, 
    score int 
); 

之間的連接表然後獲得位置

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 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 

SQL Fiddle with Demo

+0

+1。嗨,我知道最後的設計,但我不知道如何得到它。我需要詳細的步驟。 – CrazyHorse

+0

規範化的任何部分都不涉及添加額外的id列號。 –

+1

@Catcall添加這些字段,以便在多個表中不重複這些值。我不相信我的版本會保證從你那裏得到一個讚譽。 – Taryn

1

我會不同的建模。根據參數,將會有3個實體: - 電影院(cinemas_debut)>>請注意,您必須創建一個主鍵(即cinemas_id) - 電影(film_year,film_name)>>請注意,您必須創建一個主鍵即film_id) - 評論家(crit_id(PK),critic_name,得分)

現在,這是一個解釋的問題。在我看來,評論家與一部電影中的一部電影有關。因此,我想創建一個協會 - 展(cinemas_id(FK),films_id(FK),critics_id(FK))

這樣,您將擁有:

  • 電影院:2次的記錄(C1, C2)
  • 膜:1個結果(F1)
  • 批評:2個評論家(CR1,CR2)
  • 表演:2條記錄(C1-F1-CR1,C2-F1-CR2)

聽起來更好嗎? 塞爾

+0

+1這個問題的備選答案。嗨,我知道最後的設計,但我不知道如何得到它。我需要詳細的步驟。 – CrazyHorse

1

好吧,

  • 第1屆NF - 元素
    的無重複元素或組你們這樣做是:重複數據刪除電影院

  • 第二NF:在級聯關鍵
    沒有部分依賴 換句話說,確保有一個值(幾個值)唯一標識其他屬性

評論家(critic_id,critic_name,分數)(/ *我猜比分/批評家*的一部分)

電影(film_name,film_year):你可以使用這些2個字段來標識唯一的電影,但它不會是第3 NF - >添加PK film_id 電影(film_id(FK),film_name(FK),film_year(FK))

電影(cinema_name):將不會在第三NF - >添加一個PK cinema_id 影院(cinema_id,cinema_name) 電影(film_id,film_name,film_year)

您需要關聯一個fi對一個電影院,對一個批評家。根據評論家的背景:

  • 的成績取決於電影和電影院 展(cinema_id,film_id,critic_id)

  • 得分只取決於薄膜 展(film_id,critic_id )主鍵是幾對外鍵(標識一對電影院/電影/評論家),並且是第三範式(你不會對這三個FK進行分離處理) 電影(cinema_id(FK),film_id ,film_name,film_year)

  • 3rd N F:對非關鍵屬性沒有依賴關係 換言之,確保沒有屬性由複雜關鍵字的一部分標識。您沒有任何屬性取決於系統(cinema_id/film_id/critic_id在節目中替代1只)

聽起來很清楚唯一複雜的密鑰? Serge