【问题标题】:Foreign Key From two tables in one column in SQLSQL中一列中的两个表的外键
【发布时间】:2014-07-03 10:47:28
【问题描述】:

我有一个order 表,该表中的每个订单都属于devicepart(这两个字段没有特定的交集)。
所以我需要将didpid 作为FK 存储在order 表中。

"device"
+----+....
| id |<---------+
+----+....      :
: : : : .       :
                :
                :
"part"          :
+----+....      :
| id |<-------+ :
+----+....    : :
: : : : .     : :
              : :
              : :
     "order"  @ @
     +-----+-------+....
     | id  |  for  |....
     +-----+-------+....
     : : : : : : : : .

现在我应该怎么做?

  • type 字段添加到order 表并同时存储piddid 一列(例如for
  • 创建一个中间视图 type,pid,did 专栏
  • 创建更高级别的表(例如 goods) 并使其 PK 在 order,part,device 上成为 FK

哪种方法最好?还是其他方法?

【问题讨论】:

标签: mysql sql database-design relational-database foreign-key-relationship


【解决方案1】:

here 所述,使用专有外键继承。请注意 CHECK,即 MySQL 的 not enforced,因此您必须通过触发器“模拟”它。

请不要做“类型”的做法,它会导致problems

【讨论】:

    【解决方案2】:

    我会选择两张桌子,一张用于订单,另一张用于商品。项目表将包含 ID、类型(部件或设备;P 或 D)和其他详细信息。在订单表中,我将只对项目表 ID 进行 FK。

    【讨论】:

      【解决方案3】:

      如果是我,我会创建以下两个 FK 字段:didpid。你总是对一个而不是另一个有一个价值。

      您的查询将如下所示:

      SELECT o.*, COALESCE(p.descr, d.descr) AS Description,
                  COALESCE(p.number, d.number) AS PNumber
      FROM order o
      LEFT JOIN device d ON o.did = d.id
      LEFT JOIN part p ON o.pid = p.id
      

      【讨论】:

        猜你喜欢
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-13
        • 1970-01-01
        相关资源
        最近更新 更多