2017-08-22 4 views
0

プライマリキーに何を使用するのかが分かりません。mysqlの自動インクリメントIDと結合フィールドのプライマリキー

マイテーブル:

| gender | age | value | date updated | page id(the forgein key) | 
| M  | 15-24 | 100 | some date | 1 
| M  | 25-34 | 120 | some date | 1 
| M  | 35-44 | 110 | some date | 1 
| F  | 15-24 | 190 | some date | 1 
| F  | 25-34 | 230 | some date | 1 

は今、私は、主キーを追加する必要があります。自動インクリメントのidフィールドを追加してpkにすることもできますが、そのIDはforgeinキーや別のテーブルの何かとして使用されないので、追加するのは役に立たないでしょう。

ページ、性別、年齢を組み合わせてプライマリキーにすることもできますが、そのメリットがどのようなものかはわかりません。私はしばらくの間、グーグルを試みたが、まだ何をすべきか分からない。

答えて

1

私は、自動インクリメントキーを使用したり、性別と年齢をコンポジットプライマリキーとして使用するとパフォーマンスが大きく変わるとは思いません。

とにかく、重複するエントリを防ぐことができ(他のレコードで同じ値のペアを繰り返すことはできません)、テーブル構造をより明確にするため、性別と年齢のプライマリキーを選択することをお勧めします。

+0

私が間違っていない場合、プライマリキーは重複した値を持ちます。あなたがプライマリキーを使用して自動インクリメントであなたは常にユニークなレコードを持っています – Noob

+0

私は彼が同じ値のペアを繰り返すことができないことを意味し、彼が望んでいると思います – kiks73

+0

しかし、エントリ? – Noob

2

のMySQLのドキュメントを読んでください:

をテーブルの主キーは、あなたの最も重要なクエリで使用する列 の列またはセットを表します。クエリのパフォーマンスを向上させるために、関連付けられたインデックス があります。 NULL値を含めることはできないため、クエリのパフォーマンスはNOT NULL最適化のメリットを享受します。 InnoDBストレージエンジンの場合、テーブルデータは、 の超高速検索と主キー列または 列に基づくソートを行うように物理的に構成されています。

テーブルが大きくて重要ですが、明示的な 列または主キーとして使用する列がない場合は、プライマリキーとして使用する自動インクリメント値を持つ 分離列を作成することがあります。 これらの一意のIDは、外部キーを使用してテーブルを結合すると、他の テーブルの対応する行へのポインタとして機能できます。

彼の説明をありがとう@AaronDigulla ...:

必要?いいえ、舞台裏で使われていますか?さて、ディスクに保存され、 が行キャッシュなどに保存されます。削除すると、 のパフォーマンスがわずかに向上します(ミリ秒精度の時計を使用して通知します)。

しかし、誰かがこの テーブルへの参照を作成する必要がある次回は、あなたを呪います。彼らが勇気があれば、彼らはPKを追加します(そして、DBが列を作成するのに長い時間待っています)。 が勇敢でない場合は、ビジネスの キー(つまりデータ列)を使用して参照の作成が開始され、メンテナンスの悪夢が発生します。

結論:PKを持つコスト(ATMを使用していなくても) は非常に小さいので、それになります。

私の経験と知識から、プライマリキーを定義しないと、データベースは非表示のプライマリキーを作成します。だからあなたの状況では、最良のソリューションはとにかくそれを作成することです。

関連する問題