2010-12-14 3 views
2

正規化の利点の1つは、DBの冗長性を減らすことです。しかし、私はターゲットテーブルのすべての列を参照することに終わったら、私は疑問に思っていますか?すべての列が参照されている場合、外部キーによって冗長性が削減されますか?

たとえば、Genreテーブルを参照するVideoテーブルがある場合、Genreテーブルには、「ホラー」「Sci-Fi」「Romance」などのかなり静的な値の列が1つあります。

このような場合、2つの領域を区切るスペースを節約できますか、それを参照するすべての行を1か所から更新できる唯一の利点はありますか?

答えて

3

右のスペース節約はです。ONEは唯一のものではありません。

あなたが言及した場合、いいえ、その1つの列をPKとして使用するとスペースは節約できません。

このテーブルをオートナンバー/シーケンスで抽象化し、それをPKとして使用して、現在の列を候補キーにすることができます(ユニークなままです)。

しかし、あなたが概説した通りにデザインをそのまま残しておくと、利益は一貫しています。あなたはそれらの12の値だけを持っています...誤って "Horrer"または "PSY-Fi"の値を入力しないでください

+0

良い答えがたくさんあります。みんな、ありがとう!あなたは私の質問を慎重に読んで、すばやく明確に答えたので、あなたは私の投票Stephanieを受け取ります。 – labyrinth

+1

ありがとうございます。私はプログラマー型の人々は極端にルールを取ると思う...常にxを行うと、それは永遠にそして今までのことを意味する。しかし、私はあなたが理由が分からないので、人々がいつもxをすると言う理由を理解する必要があると思います。 –

0

私は代理キー(Autonumber、Identityなど)を使用して、実際の値ではなく外部キー結合に使用します。

このアイデアは、スペースを削減するよりもデータ品質に関するものです。

最もデシベル年代にINTがVARCHAR2より小さくなります(20)

-1

GenreIdがバイトまたはchar(1)することができながら、「ホラー」は、Unicodeで12バイトを取るので、あなたにも保存されます。

+0

バイト? Char?ルックアップが255の値を超えるとどうなりますか? –

+0

genreldとは? –

+0

@Stephanie:ジャンルのID –

0

はい、varchar(20)の代わりにビデオテーブルで使用するサロゲートキー(int)がある場合、またはgenraがどんなものであれ、スペースを節約します。

0

しかし、あなたは問題が自分を襲ってきました:

かなり 静的な値「ホラー」「のSF」 「ロマンス」など

のようなダースと

単一の列サロゲートキーと正規化されたテーブルでは、データベースに一度格納された「ホラー」しかありませんが、ID番号は複数の場所に保存されます(単純な数字はほとんどの場合、テキストよりも小さく、スペースを節約します)。データベースの保守性が向上するだけでなく、実際には未使用領域が節約されます。

+0

彼はPKとして値を使用していました。彼は全ての列を参照していると言いました。この場合は列のみです。 –

0

ビデオテーブルの行にGenreの有効/既定のエントリがあることを確認するにはどうすればよいですか?外部キー制約がない場合は、Videoテーブルの列の列挙が必要になり、Genreテーブルに新しい行を追加するのではなく、新しいGenreを追加するたびにスキーマを変更する必要があります。

+0

私はenumがSQL構造体であることは知らなかった。どのANSI SQL標準がそれですか? –

+0

私はそれがperseだとは思わない:enumは、外来キーを持たず、値を制約する方法だろう。 –

0

このような場合、キー値とそのインデックスは、データそのものよりもかなり大きい場合があります。そのような単純なコードを実行するもう1つのモデルは、コード表を作成し、次にそれらを検証するための挿入および更新検査制約を持つことです。また、ジャンルデータを取り出すために参加を避けることもできます。あなたはどのようにしてそれを行うのですか?あなたのアプリケーションのクエリの傾向に依存します。

2

2つのテーブルを分割する利点の1つは、スペースを節約することです。以前のように、 "Horror"や "Adventure"のような実際の値の代わりにGenre_IDを入れると、スペースが節約されます。

私の意見では、これを行うことのより良い部分は、整合性を強制することです。ビデオテーブルにテキスト値を入力すると、誤って値を変更できないのはなぜですか?いくつかの行には「冒険」や「アクション/アドベンチャー」などがあります。 2つのテーブルを持ち、外部キーを参照することで、どの値がジャンルになるかをよりよく制御できます。

要約すると、すべての列を参照するということは、特にテーブルに列が非常に少ない場合は特に気にしないでください。 IDフィールドを追加するか、または1列テーブルを「許容値」のリストとして保持する場合は、最初に整合性を強制し、スペースまたはI/Oコストを2番目に節約することが目標です。

+0

私はあなたの答えを投票することができたらいいですね。あなたは早く答えましたが、Stephanie'sはちょっときれいだったし、ポイントまで - 私は、FKがスペースを節約できないと言っていたのです。 – labyrinth

+0

私は彼に最高の投票を加えました。それは良い投票だから、彼は私から10を得るでしょう... –

+0

Stephanieの答えは、実際にはっきりとポイントに至っています。これはいつも教科書を読んで得るものです! – Jason

0

Data modification anomalies

  • あなたは新しいジャンルを追加した場合?
  • Sci-FiはSciFiと同じですか?
  • Sci-FiはSci-fiと同じですか?

同じジャンルの別のテーブル、たとえば「書籍」があれば、それは悪化します。

0

正規化はスペースを節約することとは関係ありません。特定の種類の冗長性の結果として発生する可能性がある潜在的な異常を排除することです。正規化は論理レベルを定義するだけなので、正規化されたデータベースは、正規化されていないデータベースまたは正規化されていないデータベースよりも物理的に大きくまたは物理的に小さい可能性があります。

通常、正規化によって効率的に記憶域に変換されるデザインが作成されることは事実ですが、正規化に暗黙のうちにDBMSの機能には本当に下がります。

関連する問題