【问题标题】:Database Child Table Best Practice数据库子表最佳实践
【发布时间】:2015-01-10 02:50:04
【问题描述】:

考虑以下假设场景:

对象A 1 - * 对象B 对象C 1 - * 对象B 对象D 1 - * 对象B

是否创建以下表格(多个多对多表格)是否有最佳实践...

对象A 对象B 对象C 对象D 对象A_对象B 对象C_对象B 对象D_ObjectB

...与(具有多个可为空列的单个子表)...

对象B ObjectAID(可为空) ObjectCID(可为空) ObjectDID(可为空)

我有一个案例,其中 7 个以上的对象可以有许多与之关联的 ObjectB。

需要注意的是,各个关系没有什么特别之处(即 ObjectA 和 ObjectB 之间的关系没有专有属性……否则我会直接使用多对多表)。

【问题讨论】:

  • 有什么方法可以解释的更清楚或者举个具体的例子吗?我从概念上理解你在问什么,但没有一个单一的、全球性的、正确的答案——这取决于很多因素。例如数据的性质、所需的输出等。
  • 在这种情况下,我需要将注释附加到项目中的一堆不同对象类型(级别)。这是否提供了足够的背景信息?
  • 所以对象 B 是音符,每个音符都可以与 1 个或多个对象 A、C、D E 相关联……对吗?
  • 对象 B 是注释。对象 A、C、D、E 可以有 0-* 音符与之关联。

标签: sql relational-database


【解决方案1】:

创建一个包含 3 列的表:

  • object_b_id
  • other_object_id
  • other_object_type

这样,您的所有引用都保存在一个表中,并且您没有稀疏记录。您可以轻松地从任何对象连接到它的注释,也可以从任何注释连接到它的引用对象。下面是一个简单的例子来说明它是如何工作的。

Select * from ObjectX as x
Join ObjectBReferences as r
 on x.id = r.other_object_id and r.other_object_type = 'X'
Join ObjectB b
  on r.object_b_id = b.id

我自己根据从我使用过的商业软件中借鉴的设计模式实现了这种确切类型的东西。它也是在 Rails 和其他框架中使用的标准“多态”方法。

【讨论】:

  • 我曾考虑将这条路线作为一种选择,但问题是您失去了任何关系(FK、导航属性等)。因此,这在我目前的情况下是行不通的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多