mysql - 对支持过滤不同类型的公共属性的 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
我还想对我的一组对象运行下面的每个示例查询:
- 获取以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 添加额外的工作,特别是如果类型系统具有高“扇出”。
任何有关此问题的提示将不胜感激。谢谢!
解决方案
推荐阅读
- android - Firebase auth 邮件验证是没用的,因为用户即使不点击确认链接也可以访问应用
- r - 如何在 r 中加速 read_html 运行时?
- android - 发现任务 ':barcode_scan:checkDebugManifest' 的配置有问题
- solidity - 在solidity函数中传递数组数组作为参数
- python - 如何使用 Python 将数组对象(字符串)制作成可行的列表
- r - R中三参数反向威布尔模型实现的最大似然估计
- laravel - 使用 laravel livewire 上传文件时出现错误 422
- numpy - 给定一个 numpy 二维数组的(嵌套)视图,如何检索原始数组的坐标
- javascript - 当条件为真时,如何将 div 位置从水平对齐更改为垂直对齐?
- flutter - Appbar在颤动中被Overlay隐藏