SQL多对多组合表

时间:2012-06-25 05:22:54

标签: sql sql-server database-design many-to-many normalization

我在数据库设计方面遇到了一个有趣的问题,其解决方案尚不令人满意。

我有一个表,其中包含以下字段:
- key_station(主键)
- station_name
- info

然后我有一张职位的表格:
- key_position(主键)
- position_number
- 信息
- key_station(站点的外键)

设置的表格:
- key_setup(主键)
- setup_number
- 信息
- key_station(站点的外键)

现在,Positions表列出了一个工作站的所有插槽号,Setups表列出了工作站的所有可能的不同设置。我需要的是一个表,根据设置,每个位置都有不同的部分。有些职位可能是空的。例如......

设置1
位置1 - AA
位置2 - BB
Position3 - NULL

设置2
Position1 - NULL
位置2 - CC
Position3 - NULL

所以我创建了一个表名设置,其中包含以下字段:
- key_setting(主键)
- key_position(外键)
- key_setup(外键)
- 部分

这里的问题是我必须确保设置始终具有引用表的组合。因此,当我在示例中插入新位置时,它必须在“设置”中插入2条记录(每个设置一条),或者当我插入新设置时,它必须在“设置”中插入3条记录(每个位置一条),其中包含NULL部分用户可以稍后填写。为什么?因为每个设置中的位置不会改变,只有它们分配的部分。

我目前所做的是使用两个SQL语句在表位置和设置(或设置和设置)中插入和删除。不幸的是,我在表格设置中没有相应记录的插入位置或设置问题,因为我没有处理我的操作的原子性。

所以我想知道什么是多对多关系的最优雅和正确的解决方案,其中中间表必须具有该关系的所有组合。我需要什么样的规范化?或者我可以在SQL Server中添加什么样的约束?此问题是否具有特定名称,以便我可以搜索更多?

2 个答案:

答案 0 :(得分:2)

enter image description here

  • 使用ON UPADE CASCADE ON DELETE CASCADE配置 FK

  • 插入新的StationSlotStationSetup后,


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的任何新组合。

答案 1 :(得分:1)

在“设置”表中删除key_station并添加key_position并完全删除“设置”表。这样,您将通过跟随位置参考知道给定行属于哪个站,并且您将在同一个表中存储位置及其值之间的映射(设置)。