Логика приложения для динамических опросов PHP/MSSQL

Во-первых, я думаю, что этот вопрос может быть связан с любым языком, но я указал, что использовал.

Извините, если я тоже начинаю скучать, но я пытаюсь найти лучший способ построить динамическую систему управления опросами. Мой клиент в основном сказал мне, что данные должны храниться в MS SQL, поскольку у его клиента есть только коннектор MS SQL для SAS, который будет делать отчеты.

Моя логика пока такова: 1-й. Настройте сам опрос, т. е. запросите название, краткий обзор и т. д. и т. д. 2-й. Определите свои вопросы. 3-й. Опубликовать опрос.

Что я сделал до сих пор, так это то, что когда они «опубликуют опрос», я создал специальную таблицу базы данных для этого опроса, в которой будут храниться ответы. Со стороны администратора они не смогут изменить вопросы, может быть, заголовок вопроса, но это все. Они не могут добавлять/удалять вопросы.

Вопрос в том, хорошо ли создавать отдельные таблицы базы данных? Единственное, что меня беспокоит, это то, что, скажем, администратор создает около 30 вопросов, у меня будет 30 столбцов в этой выделенной таблице. Кроме того, таким образом системе SAS может быть легко извлекать данные для отчетности. Кстати, администратор не увидит ответы на опрос в панели администратора.


person PHPology    schedule 20.01.2011    source источник


Ответы (5)


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

+------+    +-------------+    +-------------+    +-------------+    +----------+
| Exam |    | Question    |    | Choice      |    | Answer      |    | User     |
+------+    +-------------+    +-------------+    +-------------+    +----------+
| id   |    | id          |    | id          |    | id          |    | id       |
| name |    | questionNb  |    | choice      |    | user_id     |    | name     |
+------+    | question    |    | question_id |    | exam_id     |    | email    |
            | exam_id     |    | isAnswer    |    | question_id |    | password |
            +-------------+    +-------------+    | choice_id   |    +----------+
                                                  | isGood      | 
                                                  +-------------+ 

Эта модель позволила мне легко сдать экзамен из 15 вопросов, экзамен из 30 вопросов и экзамен из 50 вопросов. Чтобы адаптировать эту модель для опроса, вам, возможно, придется просто удалить части isAnswer и isGood, и вы должны быть хорошими и заменить данные пользователей анонимными общими данными, такими как возраст, доход, пол.

person JF Dion    schedule 20.01.2011

Создание столбца для каждого вопроса совершенно неправильно, изменение базы данных во время выполнения для бизнес-ориентированных целей - это «никогда не делайте». Прочитайте что-нибудь о «реляционных базах данных», все должно выглядеть так:

идентификатор table_surveys имя_опроса

table_questions id fk_survey (внешний ключ для table_surveys) question_text (значение вопроса? возможно)

table_questions_options id question_id (внешний ключ для table_questions) option_value (это может быть true/false для теста или числовое значение для опроса) option_label

table_users id имя пользователя пароль

Идентификатор table_answers options_fk (внешний ключ для table_question_options) users_fk (внешний ключ для table_users)

Таким образом, все связано друг с другом (без повторного использования вариантов, вопросов или прочего в разных опросах).

person Catalin Marin    schedule 20.01.2011
comment
Я понимаю, что вы с Джеффом говорите, и, честно говоря, я бы создал таблицу для хранения всех ответов на вопросы, но из-за этой системы SAS я подумал, что это будет хороший вариант. На самом деле я не хочу создавать несколько таблиц и вообще никогда не кодирую так, я действительно хотел узнать мнение других людей по этому поводу :-) - person PHPology; 24.01.2011

Согласно комментариям в документации, поддержка MS SQL в PHP ненадежна. в лучшем случае. Является ли PHP единственным языком, который вам разрешено использовать в проекте? Если нет, вы можете рассмотреть возможность использования C#, VB.Net или чего-то более совместимого с SQL Server. В противном случае вы можете изначально хранить данные в MySQL и экспортировать их в MS SQL Server, когда вам нужно будет провести анализ.

person Kibbee    schedule 20.01.2011
comment
Я просил клиента использовать MYSQL, но очевидно, что его клиент приобрел коннектор для MSSQL. Не поймите меня неправильно, я тоже не большой поклонник PHP/MSSQL :-(. Я мог бы изучить MYSQL, а затем экспортировать в MSSQL, но это зависит от того, как часто SAS будет творить чудеса - person PHPology; 24.01.2011

Не знаю, если я действительно понимаю ваш вопрос. Но я когда-то построил такую ​​систему опросов. И это получилось довольно быстро и легко со следующими таблицами (если я правильно помню):

USER, SURVEYS, QUESTIONS, ANSWERS, [some mapping tables]

SAS будет извлекать данные из любой виртуальной таблицы. Если все в одну-две таблицы, будет еще проще.

person user492238    schedule 20.01.2011

При всем уважении к Kibbee, поддержка PHP/MSSQL на самом деле ОЧЕНЬ хороша. Мы делаем это довольно часто, и производительность превосходит PHP/MySQL и соответствует скомпилированному C#/MSSQL (в нашем очень ограниченном и ненаучном тестировании). Предполагается, что вы используете PHP на машине Win. Запуск PHP с TLS-коннектором в отдельном блоке MSSQL — еще один шарик воска, и его настройка может быть сложной.

В любом случае, у нас был аналогичный сценарий, и мы использовали одну таблицу для управления формами (формы с идентификатором формы в качестве основного), другую для управления полями/вопросами (поля с идентификатором поля, тип поля, такой как Y/N, текст, выбор и т. д. ), а другой — для «назначения» поля форме (FormFields с FormFieldID, FormID, FieldID, параметры в массиве для выбора элементов и т. д.). Затем еще один набор таблиц для ответов на вопросы.

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

person Rich Kneece    schedule 27.05.2011
comment
И извините, ребята, что ответили через шесть месяцев после того, как вопрос был опубликован! Виноват. - person Rich Kneece; 27.05.2011