V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Oathbinder
V2EX  ›  数据库

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

  •  
  •   Oathbinder · 2018-10-13 12:42:29 +08:00 · 2494 次点击
    这是一个创建于 2015 天前的主题,其中的信息可能已经有所发展或是发生改变。

    物品(item_id, ...)

    仓库(inventory_id, ...)

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

    供应商(delivery_id, ...)

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

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

    14 条回复    2018-10-15 14:03:34 +08:00
    abcbuzhiming
        1
    abcbuzhiming  
       2018-10-13 13:17:30 +08:00   ❤️ 1
    没啥合理不合理的,你的业务就是需要外键约束的话那就是需要,但是现在的一个普遍做法就是约束在应用层实现,数据库只当仓库用,维护起来省事很多
    Oathbinder
        2
    Oathbinder  
    OP
       2018-10-13 13:33:38 +08:00
    @abcbuzhiming 比较好奇从数据库角度来说如何实现外键约束?只看业务需求的话用应用层约束也可以,现在只是好奇问一下
    abcbuzhiming
        3
    abcbuzhiming  
       2018-10-13 17:05:54 +08:00
    @Oathbinder 数据库的外键不就是那 3 种模式吗,你引用的键之间互相有联系,要么联动删除,要么不允许删除
    ruoxie
        4
    ruoxie  
       2018-10-13 17:12:04 +08:00
    很久不用物理外键了,都是程序里实现逻辑外键
    carlclone
        5
    carlclone  
       2018-10-13 17:54:37 +08:00
    朋友,21 世纪了,项目里用外键怕不是要被打
    rogwan
        6
    rogwan  
       2018-10-13 19:38:55 +08:00 via Android
    删除外键,适当冗余。
    paragon
        7
    paragon  
       2018-10-13 20:04:01 +08:00
    楼上一堆不外键的还用关系数据库干嘛呢?
    zjsxwc
        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] )


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

    成熟的 orm 框架都有相应的代码生产机
    luozic
        14
    luozic  
       2018-10-15 14:03:34 +08:00
    平行扩展或者数据库迁移就知道乱用外键的坑了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3619 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 10:29 · PVG 18:29 · LAX 03:29 · JFK 06:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.