2010-02-09 63 views
29

我正在一个文学社区网站上工作。 (screenshot)我试图找出如何通知用户,当有人评论他们发布到网站上的某些内容时,他们正在收看提交的新文献peice等。数据库设计存储通知给用户

我试图弄清楚如何构建数据库来存储这些信息。我提出了两个可能的想法。

  1. 存储链接到可通知对象,描述用户被通知的动作类型(新的,更新等)的字段。这使得复杂的显示代码,但这意味着我可以改变通知如何工作,而不是容易。这也增加了我需要从数据库中提取的数据,除非我使用缓存字段将相关属性的散列转储到表中。

    • notifiable_type
    • notifiable_id
    • USER_ID
    • 动作
    • notifiable_cache(可选的,存储从呈报对象选择的属性的散列)
  2. 对待,如电子邮件,只是通知用主题和消息将它们保存到数据库中。这导致了一个简单的视图,但一个复杂的模型,并阻止我轻松更改通知的工作方式。

    • USER_ID
    • 标题
    • 消息

我正在寻找在两个我上面列出的其他想法和意见。

+1

太这个话题不好引起很多关注。你有做出选择吗?我只是好奇... – 2010-02-11 12:47:59

+0

我还没有决定。 – epochwolf 2010-02-11 22:16:04

回答

1

我认为你的第一个选择是最好的。它比第二个更具可扩展性,它使您能够轻松查找某种类型的每个通知。您将要放弃的数据总量也会更小,因为您不必将完整的消息保存到用户。
如果你照顾你如何编写和设计你的代码,我认为它不会太复杂。

但是,如果通知不可能改变,第二个选项可能会更容易实现。

0

我并不完全确定#1中“action”字段的用意是什么,但如果我理解了您的需要,那么您基本上想让用户订阅通知队列,对吗?这些通知是打算通过电子邮件发送给用户,还是只在登录时显示,或两者都显示?

我很想把它想象成一个队列,在那里你正在“发布”通知,并且用户被“订阅”了与他们的user_id相关联的任何通知。在关系模式中,您可能希望使用类似#1的内容,其中您有一个与用户关联的类型的通知。 user_id上的索引当然要确保您可以快速获取他们的通知。如果您要查询这些内容,为了显示目的而缓存任何内容会非常有意义,这样您就不必加入任何其他表格 - 这就是假设显示数据在通知已被“发送”。然而,如果这些通知不需要在用户在网站上实时更新(例如,如果他们在登录时显示或通过电子邮件发送),那么当他们在他们的网站上查询时登录并缓存通知。如果你会实时查询这些信息以检查新的通知,并且你有很多用户,那么随着表的增长,这最终会给你带来麻烦。您可以通过为不同的通知类型设置不同的表格来分割它,或者除以user_id,但这只会让你感到满意。

您还需要确保您修剪表。您可能需要添加一个标志来指示用户已经看到了该通知,但理想情况下,一旦他们看到了该标志,您可以将其删除,并且这会使表格变小。

另一种替代方法是将通知保存在rdbms之外。考虑将通知保留在memcached中,例如,如果丢失它们的可能性是可接受的(例如,服务器停机)。或者看看Redis(http://code.google.com/p/redis/),这会使这个问题变得非常简单 - 存储通知,并为每个用户创建一个集合,并且您几乎完成了。

只是有些想法,希望它们有用。

+0

我基本上试图复制deviantArt为用户通知做的事情。 – epochwolf 2010-02-11 22:17:24

5
message : 
-id_message(pk) 
-to 
-from 
-subject 
-message 
-status (read,unread) 

reply_message : 
-id_reply(pk) 
-id_message 
-from 
-message 
-status (read,unread) 

notification : 
-id_user 
-id_notify(pk) 
-notify_type (message, or reply_message) 
-notify_desc (comment/reply on your message) 
-status (look,unlook) 

notify_detail : (for notify, when user reply or comment more than 1) 
-id_notify 
-id_sender 
-id_detail (input id_message, id_reply) 

这个怎么样?您可以将它与评论或回复评论混合使用。

1

我最近在一个iOS应用程序的Rails后端做了这个,基本上使用(2)带有时间戳,但存储在由用户索引的Redis列表中。较弱的模式(所有内容都基本填充在'消息'中)让我们在开发和早期阶段更快地移动。

此外,由于通知从Redis列表中弹出,因此就格式更改而言,没有太多旧信息需要担心,特别是如果您可以修剪“旧”信息。

+0

你能提供一个来自你的redis列表的用户记录的例子吗?这会帮助我很多。我尝试通过读/未读来实现通知。 – 2014-02-12 15:14:32

27

我正在利用的通知,以及一个项目,我不知道,如果你有你的整理到现在,或者它可能会帮助,但这样的表结构我用:

Notifications: 
- ID (PK) 
- recipient_id 
- sender_id 
- activity_type ('comment on a post', 'sent friend request', etc) 
- object_type ('post', 'photo', etc) 
- object_url (to provide a direct link to the object of the notification in HTML) 
- time_sent 
- is_unread 
+2

我没有设计通知表的知​​识,但我真正喜欢这种结构的是直接链接的想法。一旦你提取了activity_type,你可以使用正则表达式替换文本中的任何单词+1 – Atieh 2014-04-23 14:46:06

+0

存储直接链接的想法是完美的! – 2015-05-08 02:41:40

+1

你的用户设置表是什么样的?用户可以为特定活动开启/关闭通知。 – Federico 2016-01-22 05:13:38