【问题标题】:Determine type from Class Table Inheritance从类表继承中确定类型
【发布时间】:2023-03-12 01:54:01
【问题描述】:

我正在尝试实现一个具有类似于下面的表结构的数据库,其中 2 个表是一个表的子类型。

一个动物有一个主键,狗和猫有一个外键引用动物的animal_id。

animal(animal_id, bornAt)
dog(animal_id, barkSound)
cat(animal_id, meowSound)

值得注意的是,狗和猫是不相交的,所以它们不可能在animal中引用相同的animal_id。

有没有办法使用 SQL 代码来确定动物的类型,给定 animal_id?例如,如果有一条 animal_id 为 4 的狗(不知道 animal_id 为 4 的事实是狗),我想从 animal 和 dog 表中通过 join 检索数据。

【问题讨论】:

  • 两个左连接怎么样,每个子类型表上一个。
  • @Shadow 两个左连接可以工作,因为它会检查两个子类型的 id。如果我要使用该实现,我将不得不将 dog 和 cat 的 id 更改为 dog_id 和 cat_id,并检查不为 null 的列。

标签: mysql sql database-design class-table-inheritance


【解决方案1】:

我见过的一种强制不相交类型的方法是在动物表中定义一个动物类型列,并让你的外键引用它。

animal(animal_id, animal_type, bornAt)
dog(animal_id, animal_type, barkSound)
cat(animal_id, animal_type, meowSound)

假设 dog.animal_type 仅限于 'dog',而 cat.animal_type 仅限于 'cat'。然后,来自 dog 和 cat 引用 animal 的外键使用 pair 列引用 animal 中的复合唯一键。

这样您就可以强制执行不相交的类型,因为动物中的给定行必须有“狗”或“猫”,但不能同时有。您还可以知道动物表中给定行的动物类型,而无需加入其他表以查看是否有匹配项。

【讨论】:

  • 这是一个有趣的想法。对于这个实现,我假设需要 animal_id 和 animal_type 来确定动物的适当行和表。
  • 对,在您从animal 查询一行之后,您就知道要查询哪个表来获取动物特定的属性了。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 2010-11-08
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多