Как спроектировать систему обмена сообщениями в стиле нитей в Google App Engine - PullRequest
1 голос
/ 26 августа 2011

Я пытаюсь создать систему обмена сообщениями, похожую на gmail, в Google App Engine, используя Django-nonrel. Я посмотрел «Создание масштабируемых, сложных приложений на App Engine» и прочитал следующие вопросы о SO.

Система обмена сообщениями App Engine со статусом сообщения - шаблон проектирования
дизайн базы данных в google app engine

Мне нравится идея, на которую указал Кевин ( Система обмена сообщениями App Engine со статусом сообщения - Шаблон проектирования ), поэтому мои текущие модели выглядят так:

class Message(models.Model):
    sender = models.ForeignKey(User)
    content = models.TextField()
    thread_id = models.IntegerField()

class MessageReceivers(models.Model):
    message = models.ForeignKey(Message)
    users = ListField(models.CharField())
    status = models.IntegerField()  # 1 unread, 2 read ....

ListField для Django-nonrel отсюда:
http://www.allbuttonspressed.com/blog/django/2010/03/Updates-on-djangoappengine

А вот моя проблема, я не знаю, как добиться, чтобы отображать количество сообщений в каждой теме, например, в gmail. Позвольте мне прояснить мою точку зрения.
Когда пользователь, Сириус, отправляет сообщение Гарри и Рону. Модели (упрощенные для пояснения) должны быть такими:

Message
id = 1
sender = Sirius
thread_id = 1

MessageReceivers
message = 1
users = [Harry, Ron]

Затем Гарри отвечает Сириусу, но по какой-то причине он не включает Рона:

Message
id = 2
sender = Harry
thread_id = 1

MessageReceivers
message = 2
users = [Sirius]

И Сириус тоже отвечает Гарри, но он снова включает Рона:

Message
id = 3
sender = Sirius
thread_id = 1

MessageReceivers
message = 3
users = [Haary, Ron]

И когда Сириус и Гарри видят свои входящие сообщения, появляется цепочка сообщений (3). И Рон видит свой почтовый ящик, там есть поток с количеством сообщений (2). Как мне посчитать эти цифры? Должен ли я сделать новую модель, чтобы сохранить их?

Заранее спасибо,
Yoo

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

class Message(models.Model):
    sender = models.ForeignKey(User)
    content = models.TextField()

class Thread(models.Model):
    user = models.ForeignKey(User)
    messages = ListField(models.CharField())    # array of message id
    lastmodified = models.DateTimeField()
    # could have a status field for read or unread, not sure for now

Я мог бы столкнуться с трудностями в этих моделях в дальнейшем развитии, но я бы пошел с ними на время:)

Ответы [ 2 ]

1 голос
/ 26 августа 2011

Если ваши цифры будут такими низкими, я просто посчитаю их на клиенте и забуду о подсчете на сервере. Загрузите сообщения Гарри и посчитайте их. Сделайте то же самое для Сириуса. Вам придется каждый раз их подсчитывать (менее эффективно), но тогда вам не нужно хранить или вести подсчет (более эффективно), и время обработки клиентом будет намного дешевле, чем сервером.

Это кажется особенно верным, поскольку этот номер просто удобство. Если вы когда-нибудь захотите добавить такую ​​функцию, как «сортировка разговоров по количеству полученных ответов», вам нужно будет сохранить счет на сервере, но в противном случае вас это не волнует.

1 голос
/ 26 августа 2011

Попробуйте это:

from collections import defaultdict

messages = MessageReceivers.objects.filter(users='Harry')

message_threads = []
for m in messages:
  message_threads.append(m.message.thread_id)

counted_threads = defaultdict(int)

for curr in message_threads:
    counted_threads[curr] += 1

Это даст вам словарь идентификаторов thread_id с частотой их появления.

Например:

message_threads = ['a', 'b', 'c', 'a', 'a', 'b', 'a']

даст

countted_threads == defaultdict (, {'a': 4, 'c': 1, 'b': 2})

...