В некоторых веб приложениях есть возможность добавлять поля. Как это сделано?
Сейчас встречаю в приложениях функционал добавления полей к существующим таблицам. Например есть форма элемента например товара, на ней не хватает поля для внесения данных например свойства мягкий твердый, я переключаюсь в редактор выбираю добавить справочник добавляю. И оно появляется в форме, а так-же я могу его сделать видимым в таблице, оно включается в rest.
Главными плюсами модели данных EAV являются:
1. Гибкая и универсальная структура данных (можно менять количество свойств без изменения полей в таблицах);
Но ведь при добавлении свойства всё равно придется добавлять поле в таблицу Атрибуты. Или нет?
Дмитрий Бойцов, смотри, у тебя есть таблица с товарами. Атрибуты делай не дополнительными колонками, а в отдельной таблице. А значения для этих атрибутов в третьей таблице. Итого, первая таблица название товара и ид, вторая таблица с атрибутами, например вес, цвет и тп. Третья таблица значение атрибута для товара, например id товара, id атрибута, знамение. Понятно объяснил?
Чаще всего используется EAV. Если речь не о сервисе которым пользуется множество клиентов, можно добавлять реальные колонки к таблице.
Как же можно использовать документоориентированную БД, например MongoDB.
Современные РСУБД поддерживают JSON поля и операции над ними. А в Postgres есть индексируемое поле JSONB. С его помощью можно совместить преимущества классических реляционных баз, и простоту NoSQL. При этом оно ещё и очень быстро работает за счёт индексов.
То есть я условно делю данные на "основные" и храню их в реляционной структуре и создаваемые пользователем - я их храню в JSONB при показе на экране я их как то склеиваю?
Дмитрий Бойцов, именно. Скажем в обычной таблице ID строки (primary key), ID формы, позиция поля в этой форме, тип поля, и название.
А в другой таблице, Primary key, ID формы, дата ответа, и JSON объект со всеми остальными данными, ключи - PK из первой таблицы. Или для удобства чтения и написания поисковых запросов лучше в первой таблице добавить поле с символьным кодом (slug) этого поля, уникальным в рамках этой формы.
Соответственно в JSONB писать объекты вида