Дизайн БД - как лучше?
От: Sh1ZoID Россия http://vkontakte.ru/id6263850
Дата: 07.12.11 13:11
Оценка:
Всем привет.

Есть что-то вроде такой базы:
Inquiry(id, name) — опрос.
InquiryQuestion(id, inquiry_id, name) — вопрос, входящий в состав опроса
InquiryQuestionCase(id, inquiry_question_id, name) — вариант ответа
InquiryVote(id, user_id, inquiry_question_case_id) — ответ юзера

Суть — опрос. Опрос состоит из вопросов, какждый из который в свою очередь состоит из вариантов ответа. Юзер может проголосовать только один раз и при этом в качестве ответа на конкретный вопрос может выбрать только один кейз. В общем, классика.

Так вот... В том варианте, который я привёл, никаких проблемм с НФ нет, но вот такие проблемы, как ответ пользователя двумя вариантами на один вопрос или повторное участие в голосовании, приходится отлавливать на уровне кода, а хотелось бы обойти это как-то красивым дизайном базы.

К примеру, если попробовать решить проблему, связанную с голосованием с одновременным выбором нескольких ответов, то первое, что приходит в голову, это такой редизайн последней таблицы:
InquiryVote(id, user_id, inquiry_question_id, inquiry_question_case_id)
В общем, делаем unique на (user_id, inquiry_question_id, inquiry_question_case_id) и всё ровненько! Ну вообще-то не очень ровненько. Тут начинает появляться неприятный зуд насчёт НФ No. X (какой, кстати? я не спец), т.к. появляется явная повторная зависимость inquiry_question_case_id -> inquiry_question_id. Возможно, оно и не сильно страшно, но зудеть от этого не перестаёт.

В итоге, собственно, вопрос: какой ещё вариант диза можно рассмотреть для уничтожения обоих зайцев?

PS Я проектирования БД как-то никогда особо не касался, а тут вот пришлось код порефачить, а вместе с ним и базу, так что если вопрос идиотский, не ругайтесь, пожалуйста, дайте ссылку. Я долго искал, честное пионерское...
Re: Дизайн БД - как лучше?
От: Flying Dutchman Украина  
Дата: 07.12.11 17:04
Оценка:
Здравствуйте, 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).
Re[2]: Дизайн БД - как лучше?
От: Osaka  
Дата: 08.12.11 09:20
Оценка: +1 -1
>надо сделать первичный ключ в таблице Questionnaire из столбцов
>(RespondentId, QuestionId, AnswerId)
Не слушай его, pk по многим полям — зло. Для уникальности предназначен
unique index.
Posted via RSDN NNTP Server 2.1 beta
Данное сообщение является художественным произведением и освещает вымышленные события в вымышленном мире. Все совпадения с реальностью являются случайными. Не является инвестиционной рекомендацией.
Re[3]: Дизайн БД - как лучше?
От: Flying Dutchman Украина  
Дата: 08.12.11 13:12
Оценка:
Здравствуйте, Osaka, Вы писали:

>>надо сделать первичный ключ в таблице Questionnaire из столбцов

>>(RespondentId, QuestionId, AnswerId)
O>Не слушай его, pk по многим полям — зло. Для уникальности предназначен
O>unique index.

И почему это зло ?
Re[4]: Дизайн БД - как лучше?
От: Osaka  
Дата: 08.12.11 14:16
Оценка: :)
FD>И почему это зло ?
1) он может поменяться (то что меняющийся pk это зло, надеюсь возражений не вызывает?)
2) на него тяжело ссылаться (вставлять или писать сравнения — по нескольким полям)
Куча дополнительных трудностей, и в микроскоп не различимая экономия.
Данное сообщение является художественным произведением и освещает вымышленные события в вымышленном мире. Все совпадения с реальностью являются случайными. Не является инвестиционной рекомендацией.
Re[5]: Дизайн БД - как лучше?
От: Flying Dutchman Украина  
Дата: 08.12.11 22:42
Оценка:
Здравствуйте, Osaka, Вы писали:

FD>>И почему это зло ?

O>1) он может поменяться (то что меняющийся pk это зло, надеюсь возражений не вызывает?)

PK в этой таблице не меняется. Или имеется в виду, что PK из одной колонки не может поменяться, а PK из трех колонок может ? ТОгда это новое слово в теории реляционных БД.

O>2) на него тяжело ссылаться (вставлять или писать сравнения — по нескольким полям)


На эту таблицу никто не ссылается. Если будет кто-то ссылаться, можно будет добавить суррогатный PK из одной колонки.

O>Куча дополнительных трудностей, и в микроскоп не различимая экономия.


Какие еще "дополнительные трудности" ?
Re[3]: Дизайн БД - как лучше?
От: Аноним  
Дата: 12.12.11 16:49
Оценка:
Здравствуйте, Osaka, Вы писали:

>>надо сделать первичный ключ в таблице Questionnaire из столбцов

>>(RespondentId, QuestionId, AnswerId)
O>Не слушай его, pk по многим полям — зло. Для уникальности предназначен
O>unique index.

А мне по-другому и нельзя, я с ORM джанговской работаю (там у всех таблиц суррогатный pk), да и, как я понимаю, PK имелся в виду как условность, конечно я попросту unique together сделаю
Re[2]: Дизайн БД - как лучше?
От: Sh1ZoID Россия http://vkontakte.ru/id6263850
Дата: 12.12.11 17:22
Оценка:
Здравствуйте, Flying Dutchman, Вы писали:

FD>Когда-то уже была подобная тема
Автор:
Дата: 02.05.08
. Мой ответ здесь
Автор: Flying Dutchman
Дата: 03.05.08
. В моем дизайне на один вопрос можно дать единственный ответ. Если допускаются множественные ответы на один и тот же вопрос, то надо сделать первичный ключ в таблице Questionnaire из столбцов (RespondentId, QuestionId, AnswerId).


Идея отличная, спасибо, но я могу ссылаться только через суррогат, никаких составных ключей — ограничение ORM(
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.