データベースの設計に関して興味深い問題がありましたが、その解決策はまだ満足のいくものではありません。
次のフィールドを持つ駅のテーブルがあります:
- key_station (主キー)
- station_name
- 情報
それから私は位置のテーブルを持っています:
- key_position (主キー)
- position_number
- 情報
- key_station (ステーションへの外部キー)
セットアップの表:
- key_setup (主キー)
- setup_number
- 情報
- key_station (ステーションへの外部キー)
ここで、Positions テーブルにはステーションのすべてのスロット番号がリストされ、Setups テーブルにはステーションのすべての可能な異なるセットアップがリストされます。私が必要としているのは、セットアップに応じて各位置に異なる部分があるテーブルです。一部のポジションが空になる場合があります。例えば...
セットアップ 1
ポジション 1 - AA
ポジション 2 - BB
ポジション 3 - NULL
セットアップ 2
位置 1 - NULL
位置 2 - CC
位置 3 - NULL
そこで、次のフィールドを持つテーブル名Settings
を作成しました:
- key_setting (主キー)
- key_position (外部キー)
- key_setup (外部キー)
- 一部
ここでの問題は、Settingsに常に参照テーブルの組み合わせがあることを確認する必要があることです。したがって、この例で新しい位置を挿入するときは、設定に 2 つのレコード (セットアップごとに 1 つ) を挿入する必要があります。または、新しいセットアップを挿入するときは、NULL 部分を含む 3 つのレコード (位置ごとに 1 つ) を設定に挿入する必要があります。ユーザーは後で入力できます。なんで?それぞれのセットアップで位置が変わるのではなく、割り当てられたパーツのみが変わるためです。
私が現在行っていることは、2 つの SQL ステートメントを使用して、テーブルの位置と設定 (またはセットアップと設定) の両方で挿入と削除を行うことです。残念ながら、操作の原子性を考慮していなかったため、テーブル設定に対応するレコードがない挿入された位置またはセットアップの問題がありました。
したがって、中間テーブルがその関係のすべての組み合わせを持たなければならない多対多の関係に対する最もエレガントで正しい解決策は何かを知りたいです。どのような正規化が必要ですか? または、SQL Server にどのような制約を追加できますか? この問題には特定の名前が付いているので、さらに検索できますか?