我想在 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
我还想对我的一组对象运行下面的每个示例查询:
- 获取以SORT BY
偏移量 0 限制 10开头的类型
A
的对象name
tetra
name
- 获取类型为SORT BY
偏移量 10 限制 10
B
的对象color
blue
name
- 获取类型为SORT BY限制 10
C
的对象shape
square
id
我想知道满足这些要求的最佳 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
的对象)为例,方法是:name
tetra
name
- 获取以SORT BY限制 10开头的类型
B
的对象name
tetra
name
- 获取以SORT BY限制 10开头的类型
C
的对象name
tetra
name
- 合并结果并返回前 10 个。返回一个复杂的游标,该游标记录了我们从 B 和 C 中的每一个中提取了多少可用于后续分页的元素。
这种方法的一个缺点是这里的分页可能会变得非常复杂并为 MySQL 添加额外的工作,特别是如果类型系统具有高“扇出”。
任何有关此问题的提示将不胜感激。谢谢!