ショートストーリー:文字列をID番号に置き換えることは、正規化とは関係ありません。あなたのケースで自然キーを使用すると、パフォーマンスが向上する可能性があります。 私のテストでは、ナチュラルキーを使用したクエリは1〜2桁速くなりました。
回答が早すぎる可能性があります。
DBには、IDと名前列のみがあり、 が20行未満の5つのテーブルがあります。
私はこれらのテーブルがこのような構造を持っていると仮定しています。
また、your_dataには少なくとも4つの結合が必要です(少なくとも使用可能な情報を得るには)。
ただし、表a、b、c、およびdの名前は一意(ahem)なので、一意の名前は外部キー参照のターゲットとして使用できます。 はのようにテーブルyour_dataを書き直すことができます。
ID番号を文字列に置き換えても、通常のフォームは変更されません。 (文字列をID番号で置き換えることは、正規化とは関係ありません。)元のテーブルが5NFにあった場合、この書き換えは5NFにもなります。
パフォーマンスはどうですか? ID番号と結合が文字列より速いとは思われませんか?
私は、4つのテーブルa、b、c、dのそれぞれに20行を挿入することでテストしました。次に、ID番号で記述されたテストテーブルを1つ入力するデカルト積を生成し、名前を使用してデカルトテーブルを作成しました。 (それぞれ160K行)統計を更新し、いくつかのクエリを実行しました。
explain analyze
select a.a_name, b.b_name, c.c_name, d.d_name
from your_data_id
inner join a on (a.a_id = your_data_id.a_id)
inner join b on (b.b_id = your_data_id.b_id)
inner join c on (c.c_id = your_data_id.c_id)
inner join d on (d.d_id = your_data_id.d_id)
...
Total runtime: 808.472 ms
explain analyze
select a_name, b_name, c_name, d_name
from your_data
Total runtime: 132.098 ms
ID番号を使用したクエリは実行に時間がかかります。 4つの列すべてにWHERE句を使用して、1つの行を返します。
explain analyze
select a.a_name, b.b_name, c.c_name, d.d_name
from your_data_id
inner join a on (a.a_id = your_data_id.a_id and a.a_name = 'a one')
inner join b on (b.b_id = your_data_id.b_id and b.b_name = 'b one')
inner join c on (c.c_id = your_data_id.c_id and c.c_name = 'c one')
inner join d on (d.d_id = your_data_id.d_id and d.d_name = 'd one)
...
Total runtime: 14.671 ms
explain analyze
select a_name, b_name, c_name, d_name
from your_data
where a_name = 'a one' and b_name = 'b one' and c_name = 'c one' and d_name = 'd one';
...
Total runtime: 0.133 ms
ID番号を使用するテーブルのクエリに約100倍の時間がかかりました。
使用されたテストPostgreSQL 9.something。
私のアドバイス:購入する前にお試しください。あなたが投資する前にテストしています。ナチュラルキーを使用するようにデータテーブルを書き直してみてください。慎重にON UPDATE CASCADE
とON DELETE CASCADE
と考えてください。代表的なサンプルデータを使用してパフォーマンスをテストします。元の質問を編集し、見つけたものをお知らせください。
に依存します。それらの結合は実際に高価なものですか(時間がかかる)ですか?しばしば、データ複製の量を最小限に抑えるために、データは非正規化される(したがって、結合を必要とする)。本当に遅い場合を除き、私には良いデザインのように聞こえます... –