Как организовать данные в базе данных приложения?

Мое приложение должно содержать список вопросов + ответы пользователя. Как мне организовать базу данных:

             question1   question2   question2   ...         questionN
user_id_1    yes         no          yes         ...         yes
user_id_2    no          no          yes         ...         no
...
user_id_N    yes         yes         yes         ...         yes

Похоже, мне нужно создать отдельную таблицу с вопросами и присвоить каждому вопросу идентификатор. Как должна выглядеть другая таблица (поскольку количество столбцов не фиксировано)? Или мне нужно иметь еще 2 стола?

В дальнейшем мне также потребуется:

  1. подсчитать, сколько пользователей ответили «да» на вопросN;
  2. сколько друзей (другая таблица или данные json) пользователя *user_id_N* ответили "да" на вопросN.

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


person LA_    schedule 01.06.2011    source источник


Ответы (3)


Стандартный способ сделать это — сохранить каждый ответ как отдельный объект — концептуально так же, как вы изображаете, но без необходимости изменять структуру при добавлении новых вопросов. Вот пример набора определений модели, который достигает этого:

class UserInfo(db.Model):
  # Anything you want to store about the user

class Question(db.Model):
  text = db.TextProperty(required=True)
  # Anything else you want to store about the question

class Answer(db.Model):
  user = db.ReferenceProperty(UserInfo, required=True)
  question = db.ReferenceProperty(Question, required=True)
  answer_text = db.TextProperty(required=True)
person Nick Johnson    schedule 02.06.2011

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

person Limey    schedule 01.06.2011
comment
не могли бы вы предоставить мне пример таблицы «один ко многим»? Спасибо. - person LA_; 01.06.2011
comment
Ссылка на таблицу «один ко многим» — это всего лишь ссылка, в которой на одну строку в одной таблице могут ссылаться многие записи во второй таблице через внешний ключ (это первичный ключ первой таблицы, хранящийся во второй таблице для каждой записи этой таблицы) . Я думаю, вам следует посмотреть введение в дизайн базы данных, прочитать о 3-м уровне нормализации. - person Limey; 01.06.2011
comment
не могли бы вы предоставить мне ссылку на «введение в дизайн базы данных»? - person LA_; 01.06.2011
comment
Вот! сила Гугла! datanamic.com/support/lt-dez005-introduction-db- моделирование.html - person Limey; 02.06.2011

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

Кроме того, хотя у меня нет опыта доступа к хранилищу данных GAE, довольно просто подсчитать количество конкретных ответов в одном столбце, используя, по крайней мере, SQL. SELECT COUNT(questionN) FROM AnswerTable WHERE questionN='yes' будет тем, что вы будете использовать в качестве SQL-запроса.

Обратите внимание, что если вы согласитесь с предложением Лайми по дизайну, эквивалентный SQL-запрос будет больше похож на SELECT COUNT(answer) FROM AnswerTable WHERE questionID='questionN' AND answer='yes'.

person JAB    schedule 01.06.2011