Я хочу ответить на предложение @Seobander Sobolev и предоставить свое собственное.
@ Александр Соболев предлагает модель EAV . Это обеспечивает максимальную гибкость для низкой производительности и сложности, так как вам нужно объединяться несколько раз, чтобы получить все значения для сущности. Обычно вы решаете эти проблемы, сохраняя все метаданные сущности в памяти (т. Е. tblProperties
), поэтому вы не присоединяетесь к ним во время выполнения. И денормализовать значения (т. Е. tblProjectProperties
) как CLOB (т. Е. XML) из корневой таблицы. Таким образом, вы используете таблицу значений только для запросов и сортировки, но не для фактического получения данных. Кроме того, вы обычно заканчиваете кэшированием реальных сущностей по идентификатору, так что у вас нет затрат на десериализацию каждый раз. Проблемы, с которыми вы сталкиваетесь, - это недействительность кэша сущностей и их метаданных. Так что в целом нетривиальный подход.
Вместо этого я бы создал отдельную таблицу, возможно, более одной в зависимости от ваших данных, с колонкой дискриминатора / типа:
create table properties (
root_id int,
type_id int,
height int
width int
...etc...
)
Создайте уникальную комбинацию root_id
и type_id
, где type_id
будет, например, представителем мобильного устройства - предполагая отдельную таблицу поиска в моем примере.