Таблица models:
id - primary key title - varchar(256)
Таблица model_instances
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 для каждой модели в виде
model_fields for model.id=1 (by primary key): 1 - text, 2 - integer, 3 - datetime, 4 - smalltext
Fields for model_field_values_1: field_1 text, field_2 integer, field_3 datetime, field_4 varchar(256)
model_fields for model.id=2 (by primary key): 1 - text, 2 - integer, 3 - integer, 4 - integer
Fields for model_field_values_1: field_1 text, field_2 integer, field_3 integer, field_4 integer
Это решение не подходит опять же для множественных значений
P.S. Дизайн базы для CRM-системы, где пользователи сами могут создавать модели (аналог отдельной таблицы в БД) с разными типами полей (аналог колонок в БД).
В интернетах есть подобные системы (где пользователь сам создает модели), так вот, как там дизайнят БД?
Может есть где подсмотреть, какой дизайн применить?