如何避免数据库中一个属性外键引用多个表

2018-10-13 12:42:29 +08:00
 Oathbinder

物品(item_id, ...)

仓库(inventory_id, ...)

库存(item_id [FK], inventory_id [FK], ...)

供应商(delivery_id, ...)

订单(order_id [PK], item_id [FK], ...)

仓库之间可以下订单,仓库也可以给供应商下订单,在订单中要保存订单双方 ID,如果这两个值都需要使用外键约束应该如何合理设计?

2676 次点击
所在节点    数据库
14 条回复
abcbuzhiming
2018-10-13 13:17:30 +08:00
没啥合理不合理的,你的业务就是需要外键约束的话那就是需要,但是现在的一个普遍做法就是约束在应用层实现,数据库只当仓库用,维护起来省事很多
Oathbinder
2018-10-13 13:33:38 +08:00
@abcbuzhiming 比较好奇从数据库角度来说如何实现外键约束?只看业务需求的话用应用层约束也可以,现在只是好奇问一下
abcbuzhiming
2018-10-13 17:05:54 +08:00
@Oathbinder 数据库的外键不就是那 3 种模式吗,你引用的键之间互相有联系,要么联动删除,要么不允许删除
ruoxie
2018-10-13 17:12:04 +08:00
很久不用物理外键了,都是程序里实现逻辑外键
carlclone
2018-10-13 17:54:37 +08:00
朋友,21 世纪了,项目里用外键怕不是要被打
rogwan
2018-10-13 19:38:55 +08:00
删除外键,适当冗余。
paragon
2018-10-13 20:04:01 +08:00
楼上一堆不外键的还用关系数据库干嘛呢?
zjsxwc
2018-10-13 20:07:40 +08:00
订单(order_id [PK], item_id [FK], in_inventory_id [FK] ,out_delivery_id [FK],out_inventory_id [FK] )


有什么问题吗?
zjsxwc
2018-10-13 20:10:20 +08:00
楼上一堆鄙视用外键的是什么鬼,现在都自动生成代码了,外键用不用是代码生产机的活,8102 年了我其实老早就不关心外键了,因为肯定会被程序员毫无察觉的用外键。
xuanbg
2018-10-13 20:24:26 +08:00
一个字段对应多表 ID 这种情况无法使用物理外键。解决的方法很简单,要么把这个字段分拆到两个扩展表里面去,要么不使用物理外键。
Oathbinder
2018-10-13 22:22:01 +08:00
@xuanbg 具体怎么拆分呢
watzds
2018-10-14 00:28:12 +08:00
@zjsxwc 请问什么工具生成代码的
zjsxwc
2018-10-14 06:46:34 +08:00
@watzds

成熟的 orm 框架都有相应的代码生产机
luozic
2018-10-15 14:03:34 +08:00
平行扩展或者数据库迁移就知道乱用外键的坑了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/497290

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX