Как спроектировать базу данных для реляционных динамических форм?
Мои требования:
- Необходимо иметь возможность динамически добавлять формы с различными полями / типами полей
- Форма может содержать выпадающий список, который заполняется значениями другого
отправленная форма Например: штатная форма:
- Имя (текстовое поле)
- Фамилия (текстовое поле)
- Отдел (выпадающий) -> должен быть привязан к форме отдела
Форма отдела:
- Название отдела (выпадающий)
Дополнительная информация:
- Моя база данных является сервером SQL
- Я ищу производительность
- Каждая таблица может иметь более миллиона записей
- В нашей системе более 1000 пользователей
- Нам нужно получать разные отчеты по отправленной записи пользователем
- Отчеты должны иметь функцию фильтрации по всем столбцам
Опции:
- Создать одну таблицу на форму
- добавьте 2 таблицы для структуры формы и структуры поля, затем еще 2 таблицы для значения-представленной формы и значения-представленного поля
Любой другой вариант или идея?
1 ответ
Ну, я бы, вероятно, создал структуру базы данных, например:
-- This table will hold the forms
CREATE TABLE tblForm
(
Form_Id int IDENTITY(1,1) PRIMARY KEY
, Form_Name varchar(100)
-- Any other form related data such as create date, owner etc`
)
-- This table will hold the input types (i.e text box, combo box, radio buttons etc`)
CREATE TABLE tblInputType
(
InputType_Id int IDENTITY(1,1) PRIMARY KEY
, InputType_Name varchar(100)
)
-- This table will hold the inputs used in the form
CREATE TABLE tblFormInput
(
FormInput_Id int IDENTITY(1,1) PRIMARY KEY
, FormInput_Form int FOREIGN KEY REFERENCES tblForm(Form_Id)
, FormInput_InputType int FOREIGN KEY REFERENCES tblInputType(InputType_Id)
, FormInput_Name varchar(100)
, FormInput_DisplayOrder numeric(18,18)
, FormInput_DefaultText varchar(100)
)
-- This table will hold the texts and values used for combo boxes, radio buttons, check boxes etc`
CREATE TABLE tblFormInputExtraData
(
FormInputExtraData_FormInput int FOREIGN KEY REFERENCES tblFormInput(FormInput_Id)
, FormInputExtraData_Text varchar(100)
, FormInputExtraData_Value varchar(100)
)
Точки интереса:
Я использовал varchar(100) для всех текстовых данных, как произвольное число для этого примера. Вы должны выбрать подходящую длину контента для вашего приложения.
Я использовал varchar также для хранения значений входов, таких как поля со списком и переключатели, поскольку это легко. Если вы намереваетесь использовать нетекстовые значения (например, объекты.Net или изображения), вам следует изменить этот тип данных на тот, который соответствует вашим потребностям - на ум приходят xml и varbinary.