【发布时间】:2011-08-26 16:00:07
【问题描述】:
我正在尝试使用 Django-nonrel 在 Google App Engine 上设计一个类似 gmail 的线程消息传递系统。我已经观看了“在 App Engine 上构建可扩展的复杂应用程序”并阅读了关于 SO 的以下问题。
App Engine Messaging System with Message Status - Design Pattern
database design in google app engine
我喜欢 Kevin 指出的想法 (App Engine Messaging System with Message Status - Design Pattern),所以我目前的模型是这样的:
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 ....
Django-nonrel 上的 ListField 来自这里:
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)。并且 Ron 看到他的收件箱里有一个带有消息计数的线程 (2)。我应该如何计算这些数字?我应该制作一个新模型来保留它们吗?
提前致谢,
哟
编辑
当 Kevin 向我介绍 Thread 模型时,我意识到我不需要关系索引模型来满足我的要求,所以我当前的模型如下所示。
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
我可能会在这些模型的进一步开发中发现困难,但我会暂时使用它们:)
【问题讨论】:
-
电子邮件(以及扩展名 gmail)不进行广播,因此不需要该演讲中描述的技巧。即使它确实以这种方式工作,普通电子邮件的收件人数量也足够少,几乎没有必要,对于邮件列表,listserv 完成了繁重的工作。您确定您的用例类似于 gmail 吗?
-
是的,你是对的。我注意到我并不完全需要关系索引来满足我的要求,所以我决定使用 Kevin 解释的 Thread 模型。
标签: google-app-engine django-nonrel