1

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

我有一个包含以下字段的站点
表: - key_station(主键)
- station_name
- info

然后我有一个位置表:
- key_position(主键)
- position_number
- info
- key_station(外键到站)

和表 -
key_setup(主键)
- setup_number
- info
- key_station(站外键)

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

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

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

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

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

我目前所做的是使用两个 SQL 语句在表 Positions 和 Settings(或 Setups 和 Settings)中插入和删除。不幸的是,我遇到了插入位置或设置的问题,而表设置中没有相应的记录,因为我没有注意操作的原子性。

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

4

2 回答 2

2

在此处输入图像描述

  • 配置FK _ON UPADE CASCADE ON DELETE CASCADE

  • 插入新的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。
于 2012-06-25T18:40:16.603 回答
1

在 Setups 表中删除 key_station 并添加 key_position 并完全删除 Settings 表。这样,您将通过跟踪位置参考来了解给定行属于哪个站,并且您将位置与其值之间的映射存储在同一个表(设置)中。

于 2012-06-25T05:42:29.893 回答