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

#google-app-engine #google-cloud-datastore

#google-app-engine #google-облачное хранилище данных

Вопрос:

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

              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
  

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

Позже мне также понадобится:

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

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

Ответ №1:

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

 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)
  

Ответ №2:

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

Комментарии:

1. не могли бы вы, пожалуйста, предоставить мне пример таблицы «один ко многим»? Спасибо.

2. Ссылка на таблицу «один ко многим» — это просто ссылка, в которой на одну строку в одной таблице могут ссылаться многие записи во 2-й таблице с помощью внешнего ключа (это первичный ключ первой таблицы, хранящийся во 2-й таблице для каждой записи этой таблицы). Я думаю, вам следует посмотреть введение в проектирование базы данных, прочитать о 3-м уровне нормализации.

3. не могли бы вы, пожалуйста, предоставить мне ссылку на «введение в проектирование базы данных»?

4. Смотрите! мощь Google! datanamic.com/support/lt-dez005-introduction-db-modeling.html

Ответ №3:

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

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

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