【问题标题】:Antipattern to do a UNION-type in DB Design?反模式在 DB 设计中做一个 UNION 类型?
【发布时间】:2021-12-31 06:44:46
【问题描述】:

我有各种具有一些共享属性的“命名对象”,我认为将它们以以下格式保存在我的数据库中可能最有意义:

  • NamedObjectWrapper

    • 身份证
    • 创建者
    • 姓名
    • ...

    (这是我标记的工会)

    • 命名对象类型
    • NamedObject1(FK 可为空)
    • NamedObject2(FK 可为空)
    • NamedObject3(FK 可为空)
  • NamedObject1

    • ...
  • NamedObject2

    • ...
  • NamedObject3

    • ...

将设置 NamedObject1NamedObject2NamedObject3 中的一个,而其他两个为空。以上是一种可行的方法吗?我想通过只存储三个具有所有重复属性的表来做到这一点的更相关的方式很好,但我会一直将这三个表联合在一起,所以我认为这可以节省我很多工作这样做。

【问题讨论】:

  • 将除一个 FK 之外的所有 FK 设置为 null 是一个常见问题解答,通常是 DB/SQL 子类型/继承的反模式,这也是一个常见问题解答,最好通过超类型表加上子类型表或这些的左连接。
  • @philipxy faq 是什么意思?
  • 我的意思是首字母缩写词代表什么,但不是官方网站常见问题解答。
  • 这能回答你的问题吗? How can you represent inheritance in a database?

标签: sql database database-design union-types


【解决方案1】:

相反,您可以将详细对象上的 FK 转换为存储在基础对象上的共享信息。例如:

NamedObjectBase

  • 身份证
  • ...

NamedObject1

  • BaseID (FK)
  • ...

NamedObject2

  • BaseID (FK)
  • ...

NamedObject3

  • BaseID (FK)
  • ...

【讨论】:

  • Book graph Answer,希望您意识到这个Q 是由一个简单、经典的子类型集群解决的,具有完全的完整性。当然,您需要删除 do-nothing ID 字段及其额外的 do-nothing 索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多