Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Архитектура базы данных для опросов 
:(
    Опции темы
SoWa
Дата 2.8.2011, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: нет
Всего: 74



Привет, коллеги!
Помогите пожалуйста создать архитектуру БД для такого сервиса:
Пользователь создает сущность "Анкета", в которую он может добавлять вопросы. Задача первая: хранить анкеты. Тут вроде тривиально - таблица из двух полей "Пользователь" и "ИД анкеты".
 Вопросы могут быть четырех типов:
1. Вопрос, предполагающий ответ цифрой(float/int).
2. Вопрос, предполагающий ответ строкой(string).
3. Вопрос, предполагающий ответом выбор одного варианта ответа из нескольких предложенных.
4. Вопрос, предполагающий ответом выбор нескольких вариантов из предложенных.
Любой вопрос имеет стандартные поля: "номер в анкете", "текст вопроса" и возможно еще какие-нибудь.
Пользователь первым делом после создания анкеты создает в ней вопросы. Появляется задача вторая - хранить эти вопросы в БД. Надо сказать, что количество вариантов ответа может быть любым, т.е. заранее в таблице не получится зарезервировать кучу столбцов под варианты ответа.
Следующим этапом является сбор данных в анкету. Анкета попадает к респондентам, те отвечают на вопросы, и это тоже надо хранить в базе.
Важный момент - пользователей предполагается очень много, как и анкет, поэтому надо придумать так, чтобы вся БД не рухнула и довольно шустро ворочала данными.

Я придумал такой вариант, и его же раскритиковал:
Таблица "Пользователи", к которой по "ИД пользователя" привязывается таблица "Анкеты".
Таблица "Вопросы", в которой каждый вопрос привязывается к "ИД Анкеты". Таблица "Вопросы" состоит из следующих столбцов: "Номер в анкете", "Текст вопроса", "Тип вопроса".
Для вопросов с вариантами ответа создается еще таблица "Варианты ответов", куда заносятся собственно варианты, привязанные к таблице "Вопросы" уникальным ИД вопроса.
Последняя таблица - ответы. Содержит поля "Ид ответа", "ИД отвечающего", "К какой анкете принадлежит ответ"(к какому исследованию), "Ответ".

В этом случае у меня всего 5 таблиц:
Пользователи - достаточно маленькая таблица по сравнению с остальными.
Анкеты - тоже довольно маленькая, но в несколько раз больше чем Пользователи(если предположить, что у пользователя несколько анкет).
Вопросы - огромная таблица, в которой хранятся все вопросы всех анкет.
Варианты ответов - вероятно еще более огромная таблица, в которой хранятся варианты ответов на вопросы. А если смотреть на тренды в социологии - вопросы в большинстве своем имеют многовариантную структуру - таблица ого-го какая большая будет.
Ответы - её объем еще больше: на каждый вопрос из таблицы "Вопросы" тут есть не по одному ответу(ведь отвечающих на анкету много)

Как эту монстрскую структуру я думал оптимизировать:
1. Вместо двух типов вопроса с выборами ответа оставить один "Многовариантный вопрос" и ввести в таблицу "Вопросы" поле "Количество вариантов ответа".
2. Вместо того, чтобы хранить на каждую анкету десятки вопросов - можно хранить одно поле, в которое засовывать кодированную в JSON или XML(БД это поддерживает) информацию о всех вопросах анкеты. Так же и с ответами - хранить каждую заполненную анкету в XML в базе. Минусом такой "оптимизации" является то, что если пользователю приспичит поменять описание одного вопроса - надо будет достать из базы xml, распарсить её, исправить нужное место и записать обратно. Так же невозможно достать ответы на конкретные вопросы чтобы, например, проследить зависимость между вопросами "пол" и "возраст" - придется дергать все данные, а потом из них брать нужные.

Если я запутанно объяснил - могу завтра нарисовать диагрумму на эту структуру.
Во всяком случае мой вариант сдохнет, когда у меня будет примерно 500 пользователей, имеющих по одной анкете из 50 вопросов, и на каждую анкету будет по 1000 ответов. Тогда таблица "Ответы" будет из 25кк строк, что делает быстрый доступ к ней невозможным.

Есть еще идея: на каждую анкету заводить новые таблицы "Вопросы", "Варианты ответов" и "Ответы" - тогда они будут не особо большими.

Есть какие идеи?


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Akina
Дата 2.8.2011, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(SoWa @  2.8.2011,  21:10 Найти цитируемый пост)
Тогда таблица "Ответы" будет из 25кк строк, что делает быстрый доступ к ней невозможным.

Во-первых, там будут только ссылки на соотв. ИДы (ИД анкеты, ИД опрашиваемого, ИД вопроса, ИД ответа),  так что физически она будет не такой уж и большой. Да к тому же в ней синтетика-ключ нафиг не нужен.
Во-вторых, индексирование даст довольно быстрый доступ к данным. Причём, с учётом того, какая инфа оттуда будет обычно тянуться и по какому критерию отбираться, вероятно, наиболее разумны индексы по (ИД_анкеты, ИД_опрашиваемого) и по (ИД_анкеты, ИД_вопроса, ИД_ответа).
В третьих, таблицу можно и секционировать. Вероятно, по диаазону значений ИД_анкеты.

Добавлено через 1 минуту и 1 секунду
Цитата(SoWa @  2.8.2011,  21:10 Найти цитируемый пост)
Есть еще идея: на каждую анкету заводить новые таблицы "Вопросы", "Варианты ответов" и "Ответы" - тогда они будут не особо большими.

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.