如何查询/设计同一个表的多个关系?

时间:2014-02-11 20:44:46

标签: sql sql-server database-design relationship

假设我有一个实体Antenna,它属于Site。每个Antenna 始终 完全 4 Frequencies;名为ForwardBackupForwardReverseBackupReverse

现在,我正在我的数据库中对此进行建模,如此;

Site      (id int, name string);
Antenna   (id int, site_id int, forward_frequency_id int, forward_backup_frequency_id, reverse_frequency_id, reverse_backup_frequency_id);
Frequency (id int, frequency int);

...但现在我正在尝试检索附加到特定Frequency的所有Antenna,而且它似乎很乱;

SELECT * FROM Frequency WHERE Frequency.id IN (SELECT forward_frequency FROM Antenna WHERE Antenna.id = 123) 
                           OR Frequency.id IN (SELECT forward_backup_frequency FROM Antenna WHERE Antenna.id = 123)
                           OR Frequency.id IN (SELECT reverse_frequency FROM Antenna WHERE Antenna.id = 123)
                           OR Frequency.id IN (SELECT reverse_backup_frequency FROM Antenna WHERE Antenna.id = 123);

我真正想要做的事情是感觉更加优化;

SELECT * FROM Frequency WHERE Frequency.id IN (SELECT forward_frequency, forward_backup_frequency, reverse_frequency, reverse_backup_frequency FROM Antenna WHERE Antenna.id = 123);

...但SQL Server不喜欢该查询构造。

有没有更优化的方法来解决这个问题?

我想如果我定义一个Antenna_Frequency表并将其映射为多对多关系,我可以缓解这个问题,但是我放弃了对允许 的控制权 每个天线有4个频率。

谢谢, 马特

1 个答案:

答案 0 :(得分:1)

您可以创建一个包含三列的交集表ANTENNA_FREQUENCY。使用您已经考虑过的两个,但为频率类型添加第三个FK(或只是一个直接列)。

确保交集表的PK都是三列。这意味着您将永远不会超过四个频率。您的应用程序逻辑必须考虑到交叉点中缺失记录的处理方式与当前设计中的空FK列相同。

此设计将确保您有四个不同的频率(或更少,如果您不填写它们),而不允许任何重复:

ERD