Два решения:
- Создание чистой нормализованной структуры базы данных (избегайте 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
Минусы:
- Вы должны обеспечить целостность данных самостоятельно