2011-12-23 6 views
0

私はサイトをウィキペディアに似せる必要があるプロジェクトをやっていますが、データベースを作っているうちに問題を見つけました。プライマリキーの選択

私の主キーが何であるべきか分かりません。私は下の表の構造を説明するために最善を尽くしたので、問題を見ることができます。

name   | type  | content | 
-------------------------------------- 
John Doe  | overview | some text | 
---------------------------------------- 
John Doe  | background | some text | 
---------------------------------------- 
John Doe  | height  | some text | 
---------------------------------------- 
Fred Flintstone | overview | some text | 
--------------------------------------- 
Fred Flintstone | background | some text | 

id列を作成し、各レコードが単独で役に立たないため、自動増分するのは意味がないと思います。

あなたはどう思いますか?主キーが必要ですか?もしそうなら、どうすればよいでしょうか?

+0

「タイプ」の可能な値は、有限集合は頻繁に変わることはありませんか?もしそうなら、私は 'タイプ'を列として取り除き、 'overview'、 'background'などのために別々の列を持つことを再考します。 – ArjunShankar

+0

ここではいくつかの正規化が必要でしょう。 –

答えて

4

私は確かにAuto Incrementprimary IDに行きます。これは、テーブルの更新と更新を容易にし、リレーショナルセットアップの他のテーブルへのリンクをより簡単にします。

レコードを検索するときにもパフォーマンスの問題があります。レコードを検索する際

  • パフォーマンス
  • テーブル間のリレーションを維持:まとめると

  • を参照してください更新を書いて、クエリに内容を変更

を削除する簡単:http://code.openark.org/blog/mysql/reasons-to-use-auto_increment-columns-on-innodb

+0

これはタグ付きSQLサーバーではありませんが、MySQLに関してはほとんど正しいです。 InnoDBのみがクラスタ化された主キーを使用し、他のエンジン(MyISAMなど)は使用しません。また、複数のクラスタ化キーをサポートするものもあります。質問自体に関しては、あなたの答えは最高です - auto_incrementはInnoDBエンジンで最高のパフォーマンスを発揮しますが、PKの仕事は行を一意に識別できるようにするためです。連続した整数は、そのジョブを最適にします。私の+1。 –

+0

ありがとう、私はリンクを更新しました。私が思うより良い詳細には合っていますが、それほど詳細はありません。誰かが良いことを知っていますか? –

1

を私はあなたが主キーとしてidカラムを作成することをおすすめしてマッピングしますもう一つのテーブルを作成します概要、背景、高さ

id overview background height 
1  1   3   5 

などの記録スキーマのこのタイプは、完全にnormaliないがze。他の賢明なあなたは、概要、背景と高さのための異なるテーブルを作成し、それらのための上記のような関係テーブルを作成することができます。

1

これ以上作業を行う前に、mediawiki.orgをご覧ください。

サンプルデータでは、{name、type}は各行を一意に識別します。しかし、あなたのサンプルデータは代表的なものではありません。名前は現実世界ではユニークではないので、おそらくあなたは人を特定するために何か他の方法が必要です。プライマリキーとして自動インクリメントID番号を追加するだけで、このようなナンセンスが可能になるため、機能しません。

id | name   | type  | content | 
-------------------------------------- 
1 | John Doe  | overview | some text | 
2 | John Doe  | overview | some text | 
3 | John Doe  | overview | some text | 
4 | John Doe  | overview | some text | 

いくつの異なる人がいますか? (3人の人は、ID番号1と3の人は同じ人です)。{name、type}のUNIQUE制約は、 "John Doe"という名前の人だけがデータベース。

だから、あなたが人を特定するために使うことができることは他に何を知っていますか?電子メールアドレス? (ここでは魔法の弾丸を探してはいけません。電子メールアドレスであっても、「名前」よりも優れたものを探しているだけです)。

関連する問題