1

データベースの設計に関して興味深い問題がありましたが、その解決策はまだ満足のいくものではありません。

次のフィールドを持つのテーブルがあります:
- 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 にどのような制約を追加できますか? この問題には特定の名前が付いているので、さらに検索できますか?

4

2 に答える 2

2

ここに画像の説明を入力してください

  • でFKを構成するON UPADE CASCADE ON DELETE CASCADE

  • newを挿入した後StationSlot、またはStationSetupこれを実行した後


insert into StationConfiguration (StationID, StationSlotNo, StationSetupNo)
select
      a.StationID
    , b.StationSlotNo
    , a.StationSetupNo
from StationSetup as a
join StationSlot  as b on b.StationID = a.StationID
where not exists (
     select 1 
     from StationConfiguration as xx
     where xx.StationID      = a.StationID
       and xx.StationSlotNo  = b.StationSlotNo
       and xx.StationSetupNo = a.StationSetupNo
     )  
;   

  • Partこれにより、NULLである新しい組み合わせが挿入されます。
于 2012-06-25T18:40:16.603 に答える
1

Setupsテーブルでkey_stationを削除し、key_positionを追加して、Settingsテーブルを完全に削除します。そうすれば、位置参照に従って特定の行がどのステーションに属しているかを知ることができ、位置とその値の間のマッピングを同じテーブル(セットアップ)に保存できます。

于 2012-06-25T05:42:29.893 に答える