物品(item_id, ...)
仓库(inventory_id, ...)
库存(item_id [FK], inventory_id [FK], ...)
供应商(delivery_id, ...)
订单(order_id [PK], item_id [FK], ...)
仓库之间可以下订单,仓库也可以给供应商下订单,在订单中要保存单双方 ID,如果这两个值都需要使用外键约束应该如何合理设计?
![]() | 1 abcbuzhiming 2018-10-13 13:17:30 +08:00 ![]() 没啥合理不合理的,你的业务就是需要外键约束的话那就是需要,但是现在的一个普遍做法就是约束在应用层实现,数据库只当仓库用,维护起来省事很多 |
2 Oathbinder OP @abcbuzhiming 比较好奇从数据库角度来说如何实现外键约束?只看业务需求的话用应用层约束也可以,现在只是好奇问一下 |
![]() | 3 abcbuzhiming 2018-10-13 17:05:54 +08:00 @Oathbinder 数据库的外键不就是那 3 种模式吗,你引用的键之间互相有联系,要么联动删除,要么不允许删除 |
![]() | 4 ruoxie 2018-10-13 17:12:04 +08:00 很久不用物理外键了,都是程序里实现逻辑外键 |
5 carlclone 2018-10-13 17:54:37 +08:00 朋友,21 世纪了,项目里用外键怕不是要被打 |
![]() | 6 rogwan 2018-10-13 19:38:55 +08:00 via Android 删除外键,适当冗余。 |
7 paragon 2018-10-13 20:04:01 +08:00 楼上一堆不外键的还用关系数据库干嘛呢? |
![]() | 8 zjsxwc 2018-10-13 20:07:40 +08:00 via Android 订单(order_id [PK], item_id [FK], in_inventory_id [FK] ,out_delivery_id [FK],out_inventory_id [FK] ) 有什么问题吗? |
![]() | 9 zjsxwc 2018-10-13 20:10:20 +08:00 via Android 楼上一堆鄙视用外键的是什么鬼,现在都自动生成代码了,外键用不用是代码生产机的活,8102 年了我其实老早就不关心外键了,因为肯定会被程序员毫无察觉的用外键。 |
![]() | 10 xuanbg 2018-10-13 20:24:26 +08:00 一个字段对应多表 ID 这种情况无法使用物理外键。解决的方法很简单,要么把这个字段分拆到两个扩展表里面去,要么不使用物理外键。 |
11 Oathbinder OP @xuanbg 具体怎么拆分呢 |
14 luozic 2018-10-15 14:03:34 +08:00 平行扩展或者数据库迁移就知道乱用外键的坑了 |