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 は多価属性です。
  • 評論家 ID -> 評論家名
  • 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 へ:

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 に翻訳できますか? ありがとう。

4

3 に答える 3

7

私の提案は、次を使用することです。

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

create table critics
(
  critic_id int,
  critic_name varchar(50)
);

のテーブルを作成し、2 つの間の結合テーブルfilmsを作成した後critics

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

デモで SQL Fiddle を参照してください

于 2012-12-03T14:38:29.500 に答える
1

私は別の方法でモデル化したでしょう。パラメータに基づいて、3 つのエンティティがあります。 - シネマ (cinemas_debut) >> 主キー (例、cinemas_id) を作成する必要があります。 - 映画 (film_year、film_name) >> 主キー (例、film_id) を作成する必要があります。 ) - 批評家 (critic_id (PK)、批評家名、スコア)

さて、解釈の問題です。私の意見では、批評家は特定の映画館で上映された 1 本の映画に関連しています。したがって、関連付けを作成します - Show(cinemas_id (FK),films_id(FK),critics_id(FK))

このようにして、次のものが得られます。

  • 映画館: 2 レコード (C1、C2)
  • フィルム: 1 レコード (F1)
  • 批評家: 2 人の批評家 (CR1、CR2)
  • ショー: 2 レコード (C1-F1-CR1、C2-F1-CR2)

音は良くなりますか?サージ

于 2012-12-03T14:40:00.760 に答える
1

Ok、

  • 1st NF - 繰り返しの要素や要素のグループが
    ない

  • 2 番目の NF: 連結されたキーへの部分的な依存関係はありません。
    つまり、他の属性を一意に識別する値 (値のカップル) があることを確認してください。

Critic(critic_id, critical_name, score) (/* スコアは批評家の一部だと思います*/)

Film(film_name, film_year): これらの 2 つのフィールドを使用して映画を一意に識別することができますが、3 番目の NF にはなりません -> PK を追加します film_id Film(film_id (FK), film_name (FK), film_year (FK))

Cinema (cinema_name): 3rd NF にはありません -> PK を追加します cinema_id Cinema(cinema_id, cinema_name) Film(film_id, film_name, film_year)

映画を映画や批評家に関連付ける必要があります。批評家の文脈に応じて:

  • スコアは映画とシネマに依存します Show(cinema_id, film_id, critical_id)

  • スコアは、主キーが外部キーのペア (シネマ/フィルム/批評家の 1 つのカップルを識別する) であり、第 3 正規形 (これらの 3 つを処理しない) である映画 Show(film_id,批評家 ID) のみに依存します。 FK は別途) Film(cinema_id (FK), film_id, film_name, film_year)

  • 3 番目の NF: 非キー属性への依存の禁止 言い換えれば、複合キーの一部によって識別される属性がないことを確認してください。システムの唯一の複雑なキーに依存する属性はありません (代替 1 のみのショーのシネマ ID/フィルム ID/批評家 ID)

はっきり聞こえますか?サージ

于 2012-12-03T15:12:42.383 に答える