データベース:二つのテーブルの繋ぎ方
私(あなた)が検査担当者だとします。
そして、測定担当者から
CREATE TABLE measurement (
lot VARCHAR(10) NOT NULL,
test_id INTEGER NOT NULL,
data NUMERIC(17,7),
PRIMARY KEY(lot, test_id)
);
という、あるロットでのテスト番号に対する測定値データが送られてきたとします。
そして、設計担当者から
CREATE TABLE spec (
test_name VARCHAR(10) NOT NULL,
upper_limit NUMERIC(17,7),
lower_limit NUMERIC(17,7),
PRIMARY KEY(test_name)
);
という、テスト項目名に対する上限・下限の仕様データが送られてきたとします。
ここで、テスト番号とテスト項目名は同じ数だけあって、お互いが一致するように同じ順番で並んでいるとします。
この二つのテーブルを使って、測定値が範囲内か範囲外かを調べるのが目的です。
この場合、どうやって二つのテーブルを繋ぐのが一般的ですか?
自分の考えだと、一旦、specテーブルにtest_idを加えて
CREATE TABLE spec (
test_id INTEGER NOT NULL,
test_name VARCHAR(10) NOT NULL,
upper_limit NUMERIC(17,7),
lower_limit NUMERIC(17,7),
PRIMARY KEY(test_id, test_name)
);
とするのですが、第二(第三?)正規化に基づいて
CREATE TABLE spec (
test_id INTEGER NOT NULL,
upper_limit NUMERIC(17,7),
lower_limit NUMERIC(17,7),
PRIMARY KEY(test_id)
);
と
CREATE TABLE test (
test_id INTEGER NOT NULL,
test_name VARCHAR(10),
PRIMARY KEY(test_id)
);
の二つに分けるのかな、と思っています。
正規化の観点から言うと、きっとこれが正しいのかなと思っています。
でも、元々、specテーブルにはテスト項目名が入っていたのでテスト項目名と上限・下限が一目で分かっていたのに、このように分けると、いちいちspecテーブルでテスト番号を確認してから、testテーブルでそのテスト番号に該当するテスト項目名を見つけなくてはならなくなってしまいます。クエリーでの検索もJOINをしなければならなくなって遅くなりませんか?
敢えて正規化しないでおく、なんて手段もありますか?
こんな場合、皆さんならどうしますか?
「こうするように決められている」なのか、
「ああもできるし、こうもできるんですが、どっちでもいいですよ」なのか、
温度差みたいなものもできれば知りたいです。
お礼
nharasawa さん 回答いただき有難う御座います。 因みに、 id name xxx yyy と現時点では具体的にどんなフィールド名にするか決まってはいないが、 xxxやyyyとフィールドを用意しておいて、後でxxxを住所フィールドとして利用しようと 考えるのは不自然でしょうか。