データベース:二つのテーブルの繋ぎ方
私(あなた)が検査担当者だとします。
そして、測定担当者から
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をしなければならなくなって遅くなりませんか?
敢えて正規化しないでおく、なんて手段もありますか?
こんな場合、皆さんならどうしますか?
「こうするように決められている」なのか、
「ああもできるし、こうもできるんですが、どっちでもいいですよ」なのか、
温度差みたいなものもできれば知りたいです。
お礼
アドバイスありがとうございます。 勝手に注意点を上から番号振りました。 注意点 1 これはそうですね DBに限らず 注意点 2 これもプログラムを作るときに 変数名に付けている人をたまに見ます。 注意点 3 変数名が長いと起こられる言語もありましたしね。。。 注意点 4 同意 注意点 5 そうですね 注意点 6 出来れば私も nMovieID の書き方のほうがしっくりきます。
補足
皆様たくさんのアドバイスありがとうございました。 いろいろ意見を頂いて 大変勉強になりました。 今回の設計では、toginoさんのカラム名の付け方で いこうと思いました。 これにて 勝手ながらこの質問を締め切らさせて頂きます。 ありがとうございました。