структура данных appengine - дочерняя, родительская или обе? - PullRequest
1 голос
/ 10 января 2010

Я пробую свои силы в google appengine и использую хранилище данных с php и quercus. Я не знаком с Java или Python, поэтому здесь происходит много обучения. У меня рендеринг страниц, и я могу получать данные в хранилище данных и из него.

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

У меня сейчас есть встроенный MySql, и теперь я выясняю, как включить его в appengine.

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

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

Пользователи - дети группы, поэтому я могу отображать всех пользователей группы, но, возможно, есть более эффективный способ сделать это.

Как это

Groups(EntityGroup) - GroupName, Owner
↳ Topics - TopicName, Content, Owner
       ↳ Comments - Comment, Owner
↳ Users - userid

Users(EntityGroup) - userName, email, password
↳ userGroup - groupid

Затем, когда пользователь входит в систему, логика выглядит следующим образом

SELECT groupid FROM Users where password=hashofpassword+uniqueusername
foreach(groupid as group){
   SELECT users from group;
   SELECT topics from group
   foreach(topicid as topic){
     SELECT comments;
    } 
}

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

Пожалуйста, не рекомендуйте меня в документации по code.google.com, так как я уже проходил это много раз, но не до конца понимаю, что происходит с appengine.

также, как я описал выше правильный способ визуализации хранилища данных? Я думаю, что визуализация данных - это борьба, которая может вызывать некоторые проблемы.

1 Ответ

1 голос
/ 10 января 2010

Мне кажется, что между пользователями и группами существует отношение многие ко многим, да? Пользователь может принадлежать ко многим группам, и у Группы может быть много пользователей, которые подписаны на нее. Наиболее логичный способ представить это - AppEngine - предоставить объекту User ListProperty, который содержит ключ eahc групп, к которым он принадлежит. В Python это будет выглядеть так:

class User(db.Model):
    userName = db.StringProperty()
    email = db.EmailProperty()
    password = db.StringProperty() 
    groups = ListProperty(db.Key)

Всякий раз, когда пользователь подписывается на группу, вы добавляете ключ группы в список групп.

Аналогично, у объекта Group будет ListProperty, который содержит ключи каждого принадлежащего ему пользователя.

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

Трудность, с которой вы столкнетесь, заключается в том, что, когда пользователь присоединяется к группе, вам необходимо обновить группу в транзакции - вы можете добавить только одного пользователя за раз; в противном случае у вас есть вероятность, что одна запись перезапишет другую. Предположительно, Пользователь может обновляться вне транзакции, поскольку он или она должны присоединяться только к одной группе за раз.

...