リレーションシップのテクニック


一対多、どちらを取る?

 一対多のリレーションを組んでいる2つのテーブルを使ってクエリを作る場合、結合線の引かれたフィールドはどちらを選べばいいのでしょうか?
 例えばこのような場合ですが、原則として、「∞」(多)側の「番号」フィールドを選択します。 つまり「売上」テーブルでなく「売上明細」テーブルの方の「番号」フィールドにします。 一側ではレコードの重複が許されませんが、多側では許されるからです。
 これは両方で試してみて、クエリからデータ入力してみると違いがわかります。 一側の方のフィールドをクエリで選択していると、重複したデータを入力できませんが、多側だと入力可能です。

リレーションシップを切った方が良い場合

 例えば、売上管理データベースなどの場合、
・売上帳簿テーブルと商品テーブルにリレーションを設定
・売上帳簿テーブルには商品コードだけ入力
・レポート印刷などで商品名や価格などのデータが必要な時は、クエリを使って、商品マスタテーブルから商品コードをキーにしてデータを引っ張って来る
ようにすればよいでしょうか?
 これはあまりおすすめしません。 商品の価格は時々変わる可能性があるため、過去のデータを参照する時でも古い価格でなく新しい価格で表示されるなどということがあります。
 ですから、両者にはリレーションシップは設定しません。 そして、売上帳簿テーブルの方にも商品名や価格のフィールドを付けておきます。 フォームでデータ入力する時に、商品コードを入力すると(更新後処理)、商品テーブルにある該当する商品名や価格データを自動入力するマクロかイベントプロシージャを記述しておくと便利です(コンボボックスを使い、コンボボックスのColumnプロパティを参照すると便利です)。 特に、価格を算出する式が複雑であるなら、フォームで一レコード入力する毎に計算し、レコード毎に価格データを持たせるこの方法が一番簡単しかも効率的です。

戻る