2012-04-14 41 views
2

我想存储和检索社区站点的用户通知数据。当有人对用户的帖子发表评论或某人关注用户时,应该生成通知。我想要这个行为来复制Facebook的通知。因此,它应该是这样的:用于存储和检索通知数据的数组设计

User A, User B and 3 other started following you. 
User A, User Z and 2 others commented on your post Super Duper. 

如果我创建一个通用的阵列,用于保持通知那么它应该是这样的:

$notification = array ($notification_id, notification_time, $read_status, $notification_recipient_id, $notification_initiator_id, $post_id=NULL, $comment_id=NULL); // This array represents a single notification 

$notifications = array ($notification, ...); // This array is made up of many single notification array. 

所以,如果我是来检索$通知的数据数组(包含所有单个通知数组的数组),我将使用for循环并在根据时间对数组进行排序后回显结果。这会给我这样的事情作为结果:

User A started following you. 
User B started following you. 
User C started following you. 
User D started following you. 
User E started following you. 
User A commented on your post Super Duper. 
User B commented on your post Super Duper. 
User C commented on your post Super Duper. 
User D commented on your post Super Duper. 

所以,如果你看一下结果,我打算做到,而且我会走出阵列设计我公司目前拥有的一个,这两个是不同的。我可以通过执行N个操作来达到所需的结果,这些操作可能涉及到$ notifications数组的扁平化,循环递归,排序等。但是,我想我可以通过重新设计数据如何存储在阵列中来减少开销,以便在需要检索数据时我可以执行的操作数量最少。另外,由于在显示数据时需要考虑读取状态,因此实现我想要的结果将变得更加复杂。我请求提供关于设计数组结构的建议,以及如何从数组中检索数据以获得我想要的结果的示例。

回答

1

你可以做如下因素:

  • 选择类型的通知 '以下',其中READ_STATUS = 'not_read',限制2
  • 数类型的通知 '以下'
  • 选择类型 '评论',其中READ_STATUS = 'not_read',LIMIT 2
  • 计数类型的通知的通知 '评论'

每当有人读取通知时,都将其设置为“读取”。

每当有人评论或跟随某件事时,您都会为所有相关人员创建通知。例如,那些人是参与讨论的所有人,或者只是被回答的人。同样的事情发表评论。

这样,您可以格式化并显示此消息,而不会操纵太多的数据。 (你可以打包这些请求以提高效率,但你明白了)

用户A,用户B和其他3人开始关注你。
用户A,用户Z和2 其他人对您的文章Super Duper发表了评论。

我会说改变你的数据结构,像这样的问题是矫枉过正。采用这种方法,您将不断重新定义您的数据模型,这将很快成为一场噩梦。数据模型应该反映你的应用程序的大的限制,而不是像这样的“小”格式化的问题。

+0

Thx for the reply。是的,数据模型应该反映约束而不是格式化问题。但是,该应用程序目前正在开发中,并且不包含有意义的数据。所以,现在我可以正确地构建它。您的建议可以用于跟踪。然而,带有注释的变量$ post_id被引入。每篇文章可以有不同的人评论导致嵌套。当用户读取通知以及新用户评论或关注时,我还需要设置/取消设置阅读状态。你能否考虑这些并据此提出建议。谢谢。 – John 2012-04-14 21:20:31

+0

更新了我的答案。我的观点是要表明,用你现在的模型,你可以处理很多案例。保持你的数据模型简单。 – 2012-04-14 21:33:49

+0

现在我明白你的意思了。起初,我认为你指的是阵列,正如我在问题中所问的那样。但是我现在看到你的建议是直接向数据库传递SQL语句。我会在此写一个工作代码并在一天或两天内回复给您。同时,我将留下标记为未答复的问题。 Thx的抬头。 – John 2012-04-14 21:36:53