Как отобразить пользовательские формы в базу данных? - PullRequest
0 голосов
/ 12 ноября 2011

Я хочу, чтобы пользователи могли создавать формы с N полями, текстом, числами, электронной почтой, списком и т. Д. Как хранить каждое поле, не зная, сколько их будет? Первый способ, который я задумал сделать, - это сохранить все текстовые поля в одной таблице, все поля электронной почты в другой и т. Д. Затем в таблице я сохраняю информацию формы с собственным идентификатором. Как мне работать с масштабируемостью в этой системе форм? Например, наличие нескольких серверов с общими формами. Достаточно ли хорош мой дизайн? Что мне нужно хранить, чтобы затем преобразовать его в HTML с помощью XSLT?

1 Ответ

0 голосов
/ 12 ноября 2011

Два решения:

  • Создание чистой нормализованной структуры базы данных (избегайте EAV Model )
  • Хранить метаданные (например, XML и т. Д.) В базе данных

1. Решение

таблица форм :

id | user_id | name
  • user_id: «владелец» этой формы
  • name: имя формы типа "Регистрация" или что-то еще

таблица полей формы :

id | form_id | label | type | sorting | values | default 
  • form_id является внешним ключом таблицы форм
  • метка - это метка для ввода типа «Пароль»
  • тип - это тип ввода (например, выберите, электронная почта, пароль, текст), на основе которого вы можете управлять отображением / проверкой и т. Д.
  • сортировка дает вам возможность упорядочить поля в форме
  • values ​​- пример предопределенных значений - это поле выбора, сохраните его как метаданные, такие как xml, json или что-то еще, и проанализируйте его в своем приложении. Вы можете использовать поле типа, чтобы определить, как вы хотите обработать эти значения
  • default - значение по умолчанию (может быть выбранное значение в поле выбора или предварительно определенный текст для ввода текста)

если кто-то заполняет форму:

таблица заполненных_форм :

id | user_id | form_id
  • user_id: кто заполнил форму?
  • form_id: какая форма?

filled_form_values ​​

id | filled_form_id | field_id | values
  • fill_form_id: внешний ключ к таблице fill_forms
  • field_id: идентификатор поля формы
  • значения: введенные значения, возможно, хранятся в виде метаданных, таких как JSON, XML (пример: поле выбора, которое допускает множественный выбор), вы можете соединить форму и поле формы, чтобы получить тип поля, а затем вы можете обрабатывать значения правильно

Плюсы:

  • База данных обрабатывает целостность данных для вас
  • Нормализованная схема базы данных

Минусы:

  • Статическая схема, несколько соединений для извлечения полей
  • Идет в направлении EAV-модели
  • Прямое преобразование с XSLT невозможно

2. Решение

У вас есть только две таблицы:

таблица форм :

id | user_id | name | metadata
  • user_id: владелец формы (внешний ключ)
  • имя: Имя формы (например, Регистрация и т. Д.)
  • метаданные: Ваше самореализуемое описание формы (HTML, XML, JSON и т. Д.), Которое правильно описывает форму, присваивает идентификаторы элементам и т. Д.

таблица заполненных_форм :

id | form_id | user_id | Значения

  • form_id: внешний ключ к форме
  • user_id: внешний ключ для пользователя, заполнившего форму
  • значения: Ваше собственное описание заполненной формы (HTML, XML, JSON и т. Д.), Которое описывает ввод и корректно отображает его в полях

Плюсы:

  • Очень гибкий, без ловушки EAV, простая структура
  • Возможно прямое преобразование с XSLT

Минусы:

  • Вы должны обеспечить целостность данных самостоятельно
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...