Здравствуйте, Sh1ZoID, Вы писали:
SZI>Всем привет.
SZI>Есть что-то вроде такой базы:
SZI>Inquiry(id, name) — опрос.
SZI>InquiryQuestion(id, inquiry_id, name) — вопрос, входящий в состав опроса
SZI>InquiryQuestionCase(id, inquiry_question_id, name) — вариант ответа
SZI>InquiryVote(id, user_id, inquiry_question_case_id) — ответ юзера
SZI>Суть — опрос. Опрос состоит из вопросов, какждый из который в свою очередь состоит из вариантов ответа. Юзер может проголосовать только один раз и при этом в качестве ответа на конкретный вопрос может выбрать только один кейз. В общем, классика.
SZI>Так вот... В том варианте, который я привёл, никаких проблемм с НФ нет, но вот такие проблемы, как ответ пользователя двумя вариантами на один вопрос или повторное участие в голосовании, приходится отлавливать на уровне кода, а хотелось бы обойти это как-то красивым дизайном базы.
SZI>К примеру, если попробовать решить проблему, связанную с голосованием с одновременным выбором нескольких ответов, то первое, что приходит в голову, это такой редизайн последней таблицы:
SZI>InquiryVote(id, user_id, inquiry_question_id, inquiry_question_case_id)
SZI>В общем, делаем unique на (user_id, inquiry_question_id, inquiry_question_case_id) и всё ровненько! Ну вообще-то не очень ровненько. Тут начинает появляться неприятный зуд насчёт НФ No. X (какой, кстати? я не спец), т.к. появляется явная повторная зависимость inquiry_question_case_id -> inquiry_question_id. Возможно, оно и не сильно страшно, но зудеть от этого не перестаёт.
SZI>В итоге, собственно, вопрос: какой ещё вариант диза можно рассмотреть для уничтожения обоих зайцев?
SZI>PS Я проектирования БД как-то никогда особо не касался, а тут вот пришлось код порефачить, а вместе с ним и базу, так что если вопрос идиотский, не ругайтесь, пожалуйста, дайте ссылку. Я долго искал, честное пионерское...
Когда-то уже была подобная
темаАвтор:
Дата: 02.05.08
. Мой ответ
здесьАвтор: Flying Dutchman
Дата: 03.05.08
. В моем дизайне на один вопрос можно дать единственный ответ. Если допускаются множественные ответы на один и тот же вопрос, то надо сделать первичный ключ в таблице Questionnaire из столбцов (RespondentId, QuestionId, AnswerId).