Шаблон сайта с настраиваемыми пользователем полями

Есть шаблон сайта, после изменения любых доступных пользователю полей данные должны храниться в базе данных. Количество полей которые добавляет, изменяет пользователь может измениться в будущем.

Как реализовывается подобная структура баз данных, как должен будет взаимодействовать фронт с подобной структурой?

Должен ли фронт добавлять подобные поля делая запрос с указанием имени через бек или это регулируется только беком?

Нужно ли использовать в таком случаи не реляционную базу (из-за ее неконтролируемых полей)?


Ответы (1 шт):

Автор решения: S.H.

Здесь есть несколько подходов.

Для того, чтобы было весело - я постараюсь описать их коротко и используя аналогии.

  1. "всем всем всем можно делать всё-всё-всё".

Этот подход используется, грубо говоря, в GraphQL - короче, Вы из js просто можете делать всё, что угодно, с базой данных.

Правда, предполагается, что код, который работает с базой, всё таки работает на стороне сервера.

Иногда - когда он попадаетна сторону клиента - какой нибудь школьник, который умеет нажимать F12 в барузере и знает команду DROP - может дропнуть Вашу базу...

  1. Подход nongoDB.

Этот тот самый "нереляционный" подход. mongoDB ориенирована на храниение "документов"- грубо говоря, готовых и сложных по своей структуре json'чиков. Это позволяет не думать об отдельных полях, а работать с ними по принципу "я тут завел поле - а оно автоматически появится в базе данных"

Правда, при этом у вас реализуется только сохраниние и показ этого поля. Довольно беполезно, если Вы захотите о ээтому полю делать фильтр и т.п.

  1. Подход CMS, реализованных на базе релационных баз.

Это самый сложный и самый проработанный подход. Грубо говоря, у вас есть на back'е скрипты, котрые действительно позволяют определять разные новые объекты, класть их в базу данных в виде отдельных таблиц, описывать связи между ними, и делать поиск по значениям полей в этих таблицах.

Это не просто, но хорошо формализуемо из за многолетней истории развития реляционных бз данных и отработатнности моделей, используемых там.

Что еще посоветовать? Предлагаю начать с мысленного эксперимента: вот Вы начинаете расширять те объекты, котрые у Вас есть. Вы можете добавить туда текстовое поле, и захотеть поиск по нему. Можете добавить числовое поле или поле даты - тогда вы захотите сделать одновременно поиск по диапазоеу значений. А можете добавить поле с перечислимым типом, отдельным случаем которого является логическое поле.

Также, пользователь может захотеть удалить или переименовать поле.

Если Вы смоежете решить эти здачи - то бОльшая часть "хотелок" относительно добавления новых полей будет решена.

→ Ссылка