Я хотел бы представить следующую систему типов (это иерархическая система типов, а НЕ иерархические данные) в 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также хотел бы выполнить каждый из приведенных ниже примеров запросов для моего набора объектов:
- Получить объекты типа
A
, где name
начинается с tetra
SORT BY name
смещение 0 предел10 - Получить объекты типа
B
, где color
- blue
SORT BY name
смещение 10, предел 10 - Получить объекты типа
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), подход будет следующим:
- Getобъекты типа
B
, где name
начинается с tetra
SORT BY name
limit 10 - Получить объекты типа
C
, где name
начинается с tetra
SORT BY name
limit10 - Объедините результаты и верните первые 10. Верните сложный курсор, который записывает, сколько элементов мы взяли из каждого из B и C, которые можно использовать для последующей разбивки на страницы.
Одним из недостатков этого подхода является то, что разбиение на страницы здесь может стать очень сложным и добавить дополнительную работу для MySQL, особенно если система типов должна иметь большое «разветвление».
Буду весьма признателен за любые советы по этой проблеме.,Спасибо!