@nioterzor

Дизайн базы данных для множественных моделей?

Таблица 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-системы, где пользователи сами могут создавать модели (аналог отдельной таблицы в БД) с разными типами полей (аналог колонок в БД).

Может есть где подсмотреть, какой дизайн применить?
  • Вопрос задан
  • 197 просмотров
Пригласить эксперта
Ответы на вопрос 1
politon
@politon
HTML5,CSS3,JS,PHP,SQL,API,canvas,animation...
Попробуй покурить БД sugarcrm
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы