一个表有两个外键好不好

一个表有两个外键好不好,第1张

这个没有“好不好”的说法,只是说有没有必要。

先说个例子吧:

一个表table包括:编号,姓名,性别,血型,星座,属相

可是血型有四种,星座有十二个,属相也十二个,这些是固定不变的。

如果这些都直接写入数据库的话就会显的冗余。

这个可以跟常见的那个学生信息表与成绩表相对应着看,我们没有直接把成绩写入信息表中,而是用了外键。

所以我们可以把血型设置为一个表:血型表,星座设置为一个表:星座表,属相设置为一个表:属相表。然后在表table中引用外键。这个表引用了三个外键。

这个例子可能不是很好,可是就是这个道理:

为了设计的需要,一个表有几个外键是没有关系的,也不能说越多越好,这主要看我们的实际需要,而且还要使数据“完整”。

啰嗦了这么多希望你能明白。

你要订单表中两个字段引用地址表中的一个字段,那你就在订单表中创建两个外键就行了:

ALTER TABLE order ADD CONSTRAINT address1 FOREIGN KEY (address_id) REFERENCES address

ALTER TABLE order ADD CONSTRAINT address2 FOREIGN KEY (address_id) REFERENCES address

你要删除的话:

delete from order where address1 = '1001' or address2 = '1001'

像这些数据,不建议做物理删除,也就是delete。你可以加一个状态字段,将它标识为无效就可以了。因为这些数据,对业务进行一些统计和数据分析都是有用的。再比如,我使用地址1下过一些订单,现在我搬家了,地址1就没用了,我要换另外一个地址。那我会删除地址1,再添加一个地址2,但我地址1的订单还是要看的吧,你总不能删除啊。而且在地址1的订单中,我要能看到地址1的地址信息。所以,这里对于地址删除,那就不能做delete了,只能做标识。标识无效后,只能代表地址在下单选择地址或一些其它 *** 作的时候,这个无效的地址不显示,但在查看订单的时候,这个地址信息还是能显示出来的。

这个具体哪可以显示,哪不能显示,就要根据你的业务和实际情况来定了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9610030.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存