我在数据库设计方面遇到了一个有趣的问题,其解决方案尚不令人满意。
我有一个站表,其中包含以下字段:
- 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中添加什么样的约束?此问题是否具有特定名称,以便我可以搜索更多?
答案 0 :(得分:2)
使用ON UPADE CASCADE ON DELETE CASCADE
配置 FK
插入新的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的任何新组合。答案 1 :(得分:1)
在“设置”表中删除key_station并添加key_position并完全删除“设置”表。这样,您将通过跟随位置参考知道给定行属于哪个站,并且您将在同一个表中存储位置及其值之间的映射(设置)。