Гибкие формы и структура базы данных

Мне было поручено создать приложение, которое позволяет администраторам изменять содержимое входной формы пользователя (т. Е. Добавлять произвольные поля), содержимое которых хранится в базе данных. Передумайте переменные шаблона Think Modx / WordPress / Expression Engine.

Подход, который я рассматривал, заключается в реализации конкретных таблиц, где спецификация согласована (например, профили пользователей, пользовательский контент и т. Д.) И некоторые общие таблицы данных полей (то есть текст, логические) для хранения неспецифических значений. Формы (и поля модели) будут сгенерированы путем первого запроса таблиц и получения соответствующих столбцов, хотя я еще не подумал о том, как настроить проверку.

Я взглянул на эту проблему, и это, по-видимому, указывает на подход типа EAV, который, как мне кажется, из моего краткого исследования, может быть большим бременем, чем блага, которые принесет его гибкость.

Однако я прочитал несколько сообщений, в которых говорится, что это опасный маршрут:

Как создать общую базу данных, макет которой может меняться со временем?

Динамическая схема базы данных

Я был бы признателен за некоторые советы по этому вопросу, если кто-то даст

С уважением

SWK

Я создал очень большую базу данных EVA много лет назад (PHP с PostgreSQL). Получилось отлично, но это был большой проект ($$$). Все формы были полностью динамичными, с версией формы / поля, публикацией рабочих процессов, сопоставлением динамической отчетности и т. Д.

Основы EVA достаточно просты. Получение данных не является сложной. Но форма управления версиями и отчетности … вы можете потратить годы на правильное решение.

Если бы я делал это снова сегодня, я бы изучил использование одного из новых решений NoSQL ( http://en.wikipedia.org/wiki/NoSQL#Document_store ). Я бы хотел создать класс стиля DTO, который можно было бы передать генератору формы. «Модификация» формы фактически изменит DTO. Затем я буду настаивать на том, что DTO в базу данных документа / объекта.

Кроме того, по мере того, как вы создаете альфа-решение, подумайте о том, как разрешать тестовые примеры, которые охватывают потребности в версировании и отчетности.

Вот пример того, что я имею в виду: простая «Запросить форму вопроса».

  • Оригинал (версия 1): имеет первый, последний вопрос
  • Добавить поле электронной почты (версия 2): первая, последняя, ​​электронная почта, вопрос
  • Кто-то меняет свое мнение об электронной почте: (версия 3): первый, последний, вопрос
  • Появляется новый парень по маркетингу и меняет его: (версия 4): полное имя, адрес электронной почты, вопрос

Теперь вам нужно создать отчет (csv). Все становится сложным. Как ты делаешь это?

Мы решили эту проблему с версией на уровне поля со ссылками на их предыдущие версии. Кроме того, система отчетности требовала от конечного пользователя собрать определение источников данных отчета перед запуском. (привязка полей отчета к полям данных и т. д.).

Однако с документами DB я бы предположил, что вы можете сделать это по-другому. Я считаю, что новые DB, такие как CouchDB (другие?), Имеют механизм, созданный для решения этих проблем.

Удачи!!

При разработке профилей пользователей в моем последнем webapp я выбрал подход Key / Value table . Вот как выглядит мой дизайн БД:

Users table with fixed columns: id login name regdate 

Таблица пользователей, связанная с таблицей профилей (профиль пользователя HasMany).

 Profiles table with different data: user_id field value 

Таким образом, пользователь может добавить любое дополнительное поле в свой профиль. Например:

 user_id = 1 field = 'Facebook' value = 'http://facebook.com/...' 

а также

 user_id = 1 field = 'Stackoverflow' value = 'http://stackoverflow.com/user/...' 

и так далее..

В зависимости от ваших потребностей, возможно, не стоит даже поднимать поля формы на уровень «DB fields». Вместо этого вы можете сериализовать эти поля в (по существу) динамическом блоке и сохранить его в БД. Это НЕ рекомендуется, если у вас есть люди, которым необходимо запрашивать эти динамические поля вне вашего приложения (т. Е. Дизайн БД является частью более широкого публичного контракта с интегрированными системами), но если вы просто используете приложение для простого поиска эти динамические поля или если какие-либо возможности агрегирования / поиска в пределах полей являются незначительными, я бы это рассмотрел (в настоящее время эти возможности для CPU). Я использовал шаблон много раз, и у меня – до сих пор – никогда не приходилось рефакторировать. (однако я могу понять случай, когда вам может понадобиться).