Совет для разработки схемы MySQL, которая поддерживает фильтрацию по общим атрибутам разнородных типов? - PullRequest
0 голосов
/ 12 октября 2018

Я хотел бы представить следующую систему типов (это иерархическая система типов, а НЕ иерархические данные) в 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. Iтакже хотел бы выполнить каждый из приведенных ниже примеров запросов для моего набора объектов:

  1. Получить объекты типа A, где name начинается с tetra SORT BY name смещение 0 предел10
  2. Получить объекты типа B, где color - blue SORT BY name смещение 10, предел 10
  3. Получить объекты типа C, где shape - square SORT BY id limit 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 s и разрешить эти id s в отдельных таблицах ObjectOfType.Недостатком здесь является то, что мы должны поддерживать синхронизацию «справочной» таблицы со всеми таблицами отдельных типов, и мы дублируем хранилище данных.

В качестве альтернативы я также подумал о выполнении нескольких отдельных запросов и последующем объединенииих в памяти.Взяв в качестве примера запрос № 1 (Получить объекты типа A, где name начинается с tetra SORT BY name смещение 0, предел 10), подход будет следующим:

  1. Getобъекты типа B, где name начинается с tetra SORT BY name limit 10
  2. Получить объекты типа C, где name начинается с tetra SORT BY name limit10
  3. Объедините результаты и верните первые 10. Верните сложный курсор, который записывает, сколько элементов мы взяли из каждого из B и C, которые можно использовать для последующей разбивки на страницы.

Одним из недостатков этого подхода является то, что разбиение на страницы здесь может стать очень сложным и добавить дополнительную работу для MySQL, особенно если система типов должна иметь большое «разветвление».

Буду весьма признателен за любые советы по этой проблеме.,Спасибо!

...