我目前正在测试某些内容,并在尝试在表格中插入某些值时遇到问题。
我有3张表如下;设备,户外,室内。
**outdoor** ---> **devices** <----- **indoor**
net_id(pk) net_id(fk) net_id(pk)
我希望通过拥有室内或室外的net_id来建立关系,以便设备可以是室外或室内设备。因此我做了以下事情:
ALTER TABLE devices
ADD CONSTRAINT o_relationship
FOREIGN KEY (net_id)
REFERENCES outdoor (net_id);
ALTER TABLE devices
ADD CONSTRAINT i_relationship
FOREIGN KEY (net_id)
REFERENCES indoor (net_id);
现在我的问题是,当我尝试在设备中插入值时,除非net_id值属于室内和室外表,否则我无法这样做。这意味着让我们说“net_001”存在于室内和室外表中,它允许我将其插入设备中,但如果室内存在“net_001”而室外存在“net_002”,那么我想要添加“net_001”或“ net_002“在设备中它不允许我这样做。因此,我希望能够在设备表中插入,如上所述。
希望我能够清楚地解释这个问题。提前谢谢!
答案 0 :(得分:1)
在桌面设备中使用两列,一个用于室内,一个用于室外,否则无法区分室内和室外,因为它们可能与您描述的ID相同。
ALTER TABLE devices
ADD CONSTRAINT o_relationship
FOREIGN KEY (net_indoor_id)
REFERENCES indoor (net_id);
ALTER TABLE devices
ADD CONSTRAINT o_relationship
FOREIGN KEY (net_outdoor_id)
REFERENCES outdoor (net_id);
答案 1 :(得分:0)
当然根据你告诉引擎的内容,ID必须属于两个表。
您正在尝试做的是在关系数据库上建模继承,这是一个被广泛研究的,并且在选择方法时是一个经典的设计问题。
在您的情况下,device
是父类,indoor
和outdoor
是子类。
正如前面提到的here,您需要从其中一种方法中进行选择,正如我从引用的链接中引用的那样:
答案 2 :(得分:0)
但您可以采用不同的方法,使devices
包含主键,indoor
和outdoor
引用它...
答案 3 :(得分:0)
维护设备之间的关系表和&amp;出设备。
解决方案1 :
Device_Relation 表
+------------------+--------------+
| Of Table | Column |
+------------------+--------------+
| Indoor | net_id | -- <--- pk
| Outdoor | net_id | -- <--- pk
| Devices | device_id | -- <--- pk
| Device_relations | d.device_id, | -- <--- pk
| | od.net_id, | -- <--- fk
| | id.net_id | -- <--- fk
+------------------+--------------+
解决方案2 :
In_Out_Relation 表
+------------------+--------------+
| Of Table | Column |
+------------------+--------------+
| Indoor | net_id | -- <--- fk
| Outdoor | net_id | -- <--- fk
| in_out_id | in_out_id | -- <--- pk
+------------------+--------------+
对于设备表
+------------------+--------------+
| Of Table | Column |
+------------------+--------------+
| Devices | device_id | -- <--- pk
| In_Out_Relation | io.in_out_id | -- <--- fk
+------------------+--------------+