Как да организираме данните в базата данни на приложението?

Приложението ми трябва да съдържа списък с въпроси + потребителски отговори. Как трябва да организирам базата данни:

             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
Ето! силата на Google! datanamic.com/support/lt-dez005-introduction-db- modeling.html - person Limey; 02.06.2011

Използването на отделна таблица за проследяване на самите въпроси може да е добра идея. Между другото, ако просто не оставяте заглавка за него, вашият списък с потребителски идентификатори трябва сам по себе си да бъде конкретна колона в таблицата с отговори. Вероятно би било добра идея да използвате отделна таблица, за да следите кой с кого е приятел.

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

Имайте предвид, че ако следвате предложението на Limey за дизайна, еквивалентната SQL заявка ще бъде по-скоро като SELECT COUNT(answer) FROM AnswerTable WHERE questionID='questionN' AND answer='yes'.

person JAB    schedule 01.06.2011