2009-04-16 9 views
0

私は2つの列を持っています: "文字列" "int"
私はユニークな組み合わせのプライマリキーとして両方を設定します。この2列テーブルで正規化が必要ですか?

文字列に基づいて検索すると、文字列をさらに正規化して2つのint列を持つよりも貧弱になりますか?

答えて

6

重複した文字列がたくさんあると思いますか?いいえの場合、正規化すると何も得られません。もしそうであれば、インデックス作成は効果が少なくなります。 (同じインデックスを持つすべてのアイテムを取得する必要があるため)

データベースエンジンでサポートされている場合は、単に文字列をクラスタードインデックスとして設定するだけで、同様の文字列が隣り合って格納されます。

両方の列にすでに索引があり、それらの両方を比較している場合は、索引の利点がすべて得られます。

+0

クラスタ化インデックスとはどのようにして正確に設定できますか? – zsharp

+0

MSSQL:CREATE CLUSTERED INDEX foo_string_cidx ON foo_table(foo_string); –

1

これは実際にテストするのがとても簡単です。

両方の方法でテーブルを設定し、100,000のランダムな行を生成し、両方に対していくつかのクエリを実行し、どちらが速いかを確認することができます。

2

実際に文字列値が必要な場合は、答えはいいえです。

DB内の文字列を比較するのは、intを比較してからintの文字列を検索するよりも安価です。

文字列の重複に関しては、重複が多いほど、非正規化された場合に必要な記憶域が少なくなります。それはまだ遅くなるだろう。

ストレージのパフォーマンスを探している場合は、文字列int PKを使用してください。

0

Oracleを使用している場合、あなたはこのOracle docsからCOMPRESS 1

でテーブルを組織し、インデックス作り探索したいことがあります。

繰り返し排除キー 圧縮を有効にするためにCOMPRESSを指定します 主キー列の表示 索引構成表内の値。プレフィックスの長さを指定するには、 の整数を使用します。 は、プレフィックスの列番号 を圧縮します。

0

インデックスは高速検索が可能です。しかし、データベースが最も重要なフィールドをすべて知っている場合にのみインデックスを使用できることを忘れないでください。あなたは上のインデックスを持っている場合たとえば、:

int, string 

その後データベースはint型のため、またはint型と文字列の組み合わせを検索するためにインデックスを使用することができます。しかし、それを使って文字列を検索することはできません。あなたは二つの別々のインデックスを作成する場合

index 1: int 
index 2: string 

は、次にデータベースがint型および/または文字列を効率的に検索することができます。

テーブルを正規化するかどうかは、インデックスの選択の半分ではありません。通常、正規化によって検索が遅くなります。これは、別のテーブルを参照するためです。

1

テーブルはすでに正規化されています。

文字列をint型に変更することは、それ以上の正規化は行いません。

これは厄介なように見えるかもしれませんが、「正規化された」という言葉は使いこなせなくなっています。

関連する問題