mysql模式设计的建议,支持过滤不同类型的公共属性?

cwdobuhd  于 2021-06-18  发布在  Mysql
关注(0)|答案(0)|浏览(241)

我想在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 哪里 colorblue 排序依据 name 偏移10限制10
获取类型的对象 C 哪里 shapesquare 排序依据 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增加额外的工作,特别是在类型系统具有高“扇出”的情况下。
任何关于这个问题的建议都将不胜感激。谢谢!

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题