Помощь в разработке БД - EAV + Form Builder - PullRequest
4 голосов
/ 22 ноября 2010

Я пытаюсь создать своего рода конструктор форм, который позволит мне гибко определять, отображать и хранить «тесты».Т.е. позволяют пользователю через веб-интерфейс создавать новый тип теста / формы («Группировка») и определять набор полей, которые будут отображаться в форме (поля любого типа, включая дату, текст, радио,флажок и т. д.).Мне также понадобится таблица результатов, в которой будут храниться значения, сохраненные в каждой форме / тесте.

В качестве неадекватного примера у меня есть следующие 3 таблицы:

dd_TestGrouping
- TestGroupingID [pk]  
- TestGroupingName  "Algebra-1"
- TestGroupingTypeID "Math"

dd_TestFields
- TestFieldID [pk]
- TestGroupingID [fk]
- TestFieldName "Circumference"
- TestFieldType "TextBox"
- Sequence

TestResults
- TestResultID [pk]
- TestFieldID [fk]
- value "50"
- Unit "CM"

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

Заранее благодарим за любую помощь / указатели.

Ответы [ 4 ]

4 голосов
/ 22 ноября 2010

Чтобы включить значения поля со списком, вам нужно расширить вашу модель следующим образом:

dd_TestFields
- TestFieldID [pk]
- TestGroupingID [fk]
- TestFieldName "Gender"
- TestFieldType "Combo Box"
- Sequence

с новой таблицей:

dd_TestFieldSelection
- TestFieldSelectioniD [pk]
- TestFieldID [fk]
- TestFieldValue "Female"
- Sequence

Проверка, я думаю, естественно, принадлежит вашим dd_TestFieldsтаблица:

dd_TestFields
- TestFieldID [pk]
- TestGroupingID [fk]
- TestFieldName "Age"
- TestFieldType "Number/Text Box"
- Sequence
- Required "True"
- MinValue "0"
- MaxValue "150"

Это просто набросок, но вы можете расширить идеи по своему усмотрению.

3 голосов
/ 22 ноября 2010

во-первых, остерегайтесь эффекта внутренней платформы .

секунда, поддержка выпадающих списков - это просто вопрос наличия 4-й таблицы, которая включает в себя все возможные значения для поля типа "multi".

2 голосов
/ 22 ноября 2010

Похоже, это было бы хорошим вариантом для использования EAV модели .

1 голос
/ 22 ноября 2010

ОК, поэтому в своих ответах и ​​комментариях вы описали два совершенно разных сценария.

Если это конструктор форм для тестов алгебры и описан в вашем примере, пожалуйста, прочитайте здесь . EAV очень соблазнительный, но вы заплатите огромную цену за использование обычной СУБД для построения этой модели.

Тем не менее,

Если это медицинские записи, как вы говорите в комментарии. Это другая игра в мяч. Медицинские карты причудливы, потому что существует по существу неограниченное количество симптомов и значительное отсутствие симптомов. Скажем, у вас хирургическая рана и у вас жар. Это может указывать на инфекцию. Если на ране нет покраснения, припухлости, нежности или дренирующего гноя, это означало бы значительное отсутствие симптомов.

Подумайте о медицинских записях, таких как Facebook. Когда вы посещаете страницу друга, в базе данных есть PK для этого человека, а затем он получает все. Вы обычно не делаете подсчет пользователей по родному городу и женаты, например. Этот запрос - боль против EAV. То же самое с медицинскими записями. Пациент 123 появляется, вам просто нужна его / ее диаграмма. Вам не нужно задавать вопросы всем, кто имеет 6 симптомов. (Кстати, это происходит в исследованиях, но эти записи EAV должны быть отфильтрованы, повернуты и преобразованы в более 3nf формат.)

Если вы ведете медицинские записи, я бы посмотрел некоторые новые СУБД EAV, разработанные специально для медицинских записей.

...