1

1000 から 20000 の間の行数を持つテーブルを作成しようとしています。また、多くのフィールドが繰り返される可能性があります... 行の約 60% がこの値を持ち、約 50- 100人には共通の価値があります。

最近効率が気になるので、この文字列を行ごとに格納する(8~20文字程度)か、別のテーブルを作って代表IDで紐付けた方が良いか悩んでいます.. . では、このテーブルに約 1 ~ 50 行があり、約 300 ~ 5000 個の文字列が int に置き換えられていますか?

これは良いアプローチですか、それともまったく必要ですか?

4

4 に答える 4

2

はい、ほとんどの状況で良いアプローチです。これは正規化と呼ばれ、主に2つの理由で行われます。

  • 繰り返されるデータの削除
  • エンティティの繰り返しの回避

あなたの質問から、あなたの場合の理由はわかりません。

2つの違いは、1つ目はたまたま同じように見える値を再利用し、2つ目は同じ意味を持つ値を接続することです。実際の違いは、値が変更された場合、つまり1つのレコードの値が変更された場合、値自体が変更されて他のすべてのレコードでも変更された場合、またはそのレコードが新しい値に接続された場合にどうなるかです。他のレコードは変更されません。

それが最初の理由である場合は、データベースのスペースを節約できますが、レコードの更新はより複雑になります。2番目の理由である場合は、スペースを節約するだけでなく、値が1つの場所にしか保存されないため、不整合のリスクも軽減されます。

于 2013-03-08T17:46:16.040 に答える
1

Avitus の言う通り、ルックアップを作成するのは一般的に良い習慣です。

このテーブルを使用する JOINS について考えてみてください。何も持っていない場合は、ルックアップについて気にせず、列にインデックスを付けるだけです。

しかし、(同じサイズの) 他のテーブルとテーブルを結合し始めるとすぐに、パフォーマンスの低下が発生します。これは、(ほとんどの場合) ルックアップを導入することで補うことができます。

于 2013-03-08T17:38:31.630 に答える
1

これは、文字列のルックアップ テーブルを持つ良いアプローチです。そうすれば、整数値に対してより効率的なインデックスを作成できます。絶対に必要というわけではありませんが、良い習慣としてそうします。

于 2013-03-08T17:27:55.093 に答える
1

intルックアップ テーブルへの外部キーを使用することをお勧めします (2 番目のシナリオで説明したように)。これにより、インデックスは VARCHAR のインデックス作成よりもはるかに小さくなるため、必要なストレージは小さくなります。パフォーマンスも向上するはずです。

于 2013-03-08T17:29:00.080 に答える