php: Mysql Database Design и Workflow, нужно больше творчества! - PullRequest
0 голосов
/ 08 мая 2011

Мне было интересно, может ли кто-нибудь помочь мне с моим дизайном php-mysql

мое текущее приложение. (это более или менее опросное приложение), которое позволяет пользователям хранить вопросы о нацеливании на определенные функции в других продуктах, также сохраненных в другой таблице в базе данных!

например, пользователь может опубликовать автомобиль: и затем спросить пользователей о том, есть ли в нем безопасные элементы его автомобиля.

db автомобиля: Id, марка, безопасность

Бренд = Быстрый
безопасность = ABS = ABS (антиблокировочная система тормозов), DriverAirBag = подушки безопасности

db вопросов: ID, вопрос, ответ, цель, тип

например, данные:

Вопрос: варианты безопасности, которые вам нравятся
Ответ: ABS = ABS (антиблокировочная система тормозов), DriverAirBag = Подушки безопасности "
цель: безопасность
тип = флажок

Проблема в том, что для отображения сохраненных вопросов мне нужно.

1) цикл по всем вопросам, эхо-вопрос и цель эха в скрытом вводе,
2) Разнесите поле «Ответ» дважды (1-е с «,», чтобы получить каждый ответ, а другой с «=», чтобы отличаться> между тем, что находится внутри базы данных [0], и удобным текстом [1]
3) отметьте тип, чтобы выбрать тип отображения (флажок 3 варианта, выберите, текст)
4) установите этот тип отображения [0] и покажите [1] для пользователя !!! (глупо, я знаю: ()
например:

<флажок значение = $ expolde [0]> $ взрываются [1]

Все эти шаги делают его очень трудным в обслуживании, не гибким ни при каких условиях, потому что отображение встраивается в код: (,

есть идеи :)?

Ответы [ 2 ]

0 голосов
/ 08 мая 2011

Если вы хотите использовать PHP-приложение для опросов, я думаю, для ясности вам нужно что-то, где:

  1. один пользователь может добавить тему (автомобиль в вашем примере).
  2. может быть произвольное количество вопросов, прикрепленных к теме этим пользователем
  3. каждый вопрос может принимать несколько типов ответов: да / нет (ввод флажка), число (ввод текста или, скажем, 10 радиокнопок со значениями от 1 до 10 и т. Д.), Одиночный или множественный выбор (выберите с или без атрибута multi) ), произвольные данные (textarea). Кроме того, некоторые вопросы могут содержать комментарии / поле «прочее, пожалуйста, объясните».
  4. любой другой пользователь может ответить на все вопросы, и все они сохраняются.

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

Для этого, я думаю, вам нужно несколько таблиц:

Предметы id int pri_key и все, что может прийти на ум: бренд, тип и т. д.

Вопросы id int pri_key , текст varchar , тема int f_key , тип int / enum /?

QuestionOptions id int pri_key , вопрос int f_key , опция varchar

Пользователи id int pri_key + независимо от вашей структуры аутентификации

UserReplies пользователь int f_key , вопрос int f_key , ответ varchar , комментарии varchar

Пользователь-создатель устанавливает тему и задает к ней несколько вопросов. Каждый вопрос знает, какой это тип - поле «тип» может быть целым числом или значением enum, я сам предпочитаю хранить такие данные как целое число и определять константы в php, используя что-то вроде QTYPE_MULTISELECT или QTYPE_BOOLEAN для удобства чтения.

Для вопросов с одним / несколькими вариантами пользователь-пользователь также заполняет таблицу QuestionOptions, в которой хранятся параметры для тега select.

Для отображения всех вопросов будет что-то вроде

SELECT Questions.id, Questions.text, Questions.type, GROUP_CONCAT (CONCAT (questionOptions.id, questionOptions.option)) в качестве параметров AS ОТ ВОПРОСОВ ОСТАВЛЕННЫХ ВОПРОСОВ ВопросыOptions ON (Вопросы.type = $ select AND Questions.id = QuestionsOptions.question) WHERE Questions.subject = $ subject GROUP BY Questions.id

GROUP_CONCAT и CONCAT здесь должны быть изменены так, чтобы они возвращали что-то вроде 5: Option_One; 6: Option_Two и т. Д., Так что взорвать данные не составит большого труда.

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

Существует также недостаток в вышеупомянутой схеме в том, что ответы на «вопрос с несколькими ответами» хранятся в развернутом виде в поле «ответ» таблицы UserReplies. Лучше добавить еще одну таблицу, в которой каждая запись содержит значение параметра, выбранное пользователем для того или иного вопроса. Таким образом, в базе данных не будет ненужной денормализации, и запросы на статистику будут намного проще (т. Е. Запросить, какие варианты наиболее популярны в одном вопросе)

0 голосов
/ 08 мая 2011

Я бы разделил таблицы на схему типа «один ко многим», например:

 CarTable
       ID
       Brand
       Model

 CarInfo
      CarID      # Foreign key to Car Table
      Category   # Optional: Safety, Performance, Looks, etc...
      Value      # Specific Info Value: ABS, Air Bags, etc...

В этом дизайне вы можете иметь от 0 до многих записей CarInfo для каждого автомобиля, что упрощает добавление / удаление информационных записей для автомобиля без необходимости разбора потенциально сложного поля, как в исходном проекте.

Ваш дизайн таблицы вопросов может быть похожим в зависимости от вашей конечной цели:

 Question
    ID
    Description

 QuestionInfo
    QuestionID
    Category
    Value

Некоторые другие вещи, которые вы должны рассмотреть, и вопросы, которые вы должны задавать себе:

  1. Как вы обрабатываете пользовательские вводы? Если пользователь1 вводит «Подушки безопасности», а пользователь2 запрашивает «Подушку на стороне водителя», как вы собираетесь сопоставить эти два?
  2. Убедитесь, что вы понимаете проблему, прежде чем пытаться ее решить. Из вашего вопроса мне было не ясно, что вы пытаетесь сделать (это может быть только я или ограниченный размер вопроса здесь).
  3. Будьте внимательны при выводе необработанных значений базы данных (например, поля типа в таблице вопросов). Это хорошо, если значения базы данных не могут быть введены пользователем или должным образом очищены. Выполните поиск «SQL-инъекция», если вы не знакомы с ним.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...