我想在mysql中表示以下类型系统(这是一个层次类型系统,而不是层次数据):
type A {
id
name
}
type B extends A {
id
name
color
}
type C extends A {
id
name
shape
}
由继承树表示,如下所示:
A
/ \
B C
本质上,我想存储一组类型的对象 B
以及 C
在mysql数据库中。我还想对我的对象集运行下面的每个示例查询:
获取类型的对象 A
哪里 name
开始于 tetra
排序依据 name
偏移0限制10
获取类型的对象 B
哪里 color
是 blue
排序依据 name
偏移10限制10
获取类型的对象 C
哪里 shape
是 square
排序依据 id
限制10
我想知道什么样的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
要执行筛选/排序/分页的表。然后我们可以返回结果 id
解决这些问题 id
在各个objectoftype表中。这里的缺点是,我们必须使“reference”表与所有单独的类型表保持同步,而且我们要复制数据存储。
另外,我还考虑运行多个单独的查询,然后将它们连接到内存中。获取查询#1(获取类型的对象 A
哪里 name
开始于 tetra
排序依据 name
偏移量0(限值10)作为一个例子,方法是:
获取类型的对象 B
哪里 name
开始于 tetra
排序依据 name
限制10
获取类型的对象 C
哪里 name
开始于 tetra
排序依据 name
限制10
合并结果并返回前10个。返回一个复杂的游标,它记录了我们从b和c中提取的可用于后续分页的元素的数量。
这种方法的一个缺点是,这里的分页可能会变得非常复杂,并为mysql增加额外的工作,特别是在类型系统具有高“扇出”的情况下。
任何关于这个问题的建议都将不胜感激。谢谢!
暂无答案!
目前还没有任何答案,快来回答吧!