首页 > 解决方案 > 对支持过滤不同类型的公共属性的 MySQL 模式设计的建议?

问题描述

我想在 MySQL 中表示以下类型系统(这是一个分层类型系统,而不是分层数据):

type A {
  id
  name
}

type B extends A {
  id
  name
  color
}

type C extends A {
  id
  name
  shape
}

它由继承树表示,如下所示:

     A
   /   \
  B     C

本质上,我想在我的 MySQL 数据库中存储一组类型B和(“叶”类型)的对象。C我还想对我的一组对象运行下面的每个示例查询:

  1. 获取以SORT BY 偏移量 0 限制 10开头的类型A的对象nametetraname
  2. 获取类型为SORT BY 偏移量 10 限制 10B的对象colorbluename
  3. 获取类型为SORT BY限制 10C的对象shapesquareid

我想知道满足这些要求的最佳 MySQL 模式是什么?


这是我目前的方法,尽管我有点犹豫是否要继续前进,因为它需要大量的非规范化:

// global "reference" table containing all fields
// you can filter or sort by
table Objects {
  id (required) 
  name (required)
  color (optional)
}

table ObjectsOfTypeB {
  id (required)
  name (required)
  color (required)
}

table ObjectsOfTypeC {
  id (required)
  name (required)
  shape (optional)
}

因此,对于上述任何查询,我们都会参考该Objects表来执行过滤/排序/分页。然后我们可以返回结果s 并在各个 ObjectOfType 表中id解析这些s。id这里的缺点是我们必须使“参考”表与所有单独的类型表保持同步,并且我们正在复制数据存储。

或者,我还考虑过运行多个单独的查询,然后在内存中加入它们。以查询#1(获取以SORT BY偏移量 0 限制 10开头的类型A的对象)为例,方法是:nametetraname

  1. 获取以SORT BY限制 10开头的类型B的对象nametetraname
  2. 获取以SORT BY限制 10开头的类型C的对象nametetraname
  3. 合并结果并返回前 10 个。返回一个复杂的游标,该游标记录了我们从 B 和 C 中的每一个中提取了多少可用于后续分页的元素。

这种方法的一个缺点是这里的分页可能会变得非常复杂并为 MySQL 添加额外的工作,特别是如果类型系统具有高“扇出”。

任何有关此问题的提示将不胜感激。谢谢!

标签: mysqldatabase-designdatabase-schemahierarchyclass-table-inheritance

解决方案


推荐阅读