id - primary key
model_id - foreign key to app_models.id
title - varchar(256)
Таблица model_fields
id - pk
model_id - foreign key to models.id
instance_id - foreign key to model_instances.id
title - name of the field
type - enum [text, checkbox, radio, select, 'etc']
Таблица model_field_values:
instance_id - forein key model_instance.id
field_id - foreign key to model_fields.id
value - text
Может быть несколько значений для поля (например, когда поле select multiple)
Проблема: value - поле типа text, чтобы можно было сохранить разные типы (текст, дату, число), но поиск по ним будет медленным и неэффективным (если будем искать по числу, все равно поле текстовое).
Например, для 10 моделей, где у каждой уже есть 1000 экземпляров с 10 полями в каждом таблица model_field_values будет содержать 100000 записей, а если есть множественные поля, то и 120000 записей.
Если бы создавались отдельные таблицы, то было бы 10 таблиц с 1000 записей в каждой + несколько таблиц для хранения множественных значений.
Варианты решения:
Для каждой модели создавать model_field_values_{id модели} таблицу с той же структурой.
Плюсы: любое поле можно сделать множественным (например, несколько номеров телефонов, несколько email для текстовых полей), больше таблиц - но меньше записей в каждой, минусы все те же самые - value всегда текстовое поле).
Либо, т.к. мы знаем, что в model_fields, можно создавать model_field_values для каждой модели в виде
Это решение не подходит опять же для множественных значений
P.S. Дизайн базы для CRM-системы, где пользователи сами могут создавать модели (аналог отдельной таблицы в БД) с разными типами полей (аналог колонок в БД).
Может есть где подсмотреть, какой дизайн применить?