LINUX.ORG.RU

Дизайн БД?

 ,


0

2

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

В интернетах есть подобные системы (где пользователь сам создает модели), так вот, как там дизайнят БД?

Может есть где подсмотреть, какой дизайн применить?


EAV - говно. лучше всего сохранять модели как json кмк.

drsm ()

mysql сам хранит «дизайн» таблиц в базе information_schema. Открой да посмотри.

anonymous ()

Кажется что для поиска надо делать отдельные структуры.

но ты скажи, если у тебя не магазин, то зачем разным пользователям искать друг у друга? а если только один пользователь ищет у себя, то поиск в любом случае мгновенным будет, главное user_id не забудь добавить в условие да и всё.

если таки нужен поиск, кажется разумным прикрутить его отдельно, какой нибудь люценой или чем там модно.

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 2)

Сдаётся мне, товарисч хочет написать свой 1С...

hobbit ★★★★★ ()

Все просто, сделать таблицу с полями и таблицу с столбцами разных типов

В таблице с полями сделать столбец типа поля по которому и берется значение во второй таблице. Таким образом можно индексировать и прочее

ism ★★★ ()
Последнее исправление: ism (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.