活动流/源,是否反规范化?

ano*_*reh 17 database-design social-networking

我知道这个问题的变化已经被问了很多次之前(我看过他们,他们是2:1,2),但我不能换我的头周围任何东西,感觉就像合适的解决方案.

从多对多关系,扇出,多态关联,NoSQL解决方案,消息队列,非规范化以及它们的组合,都提出了一切建议.

我知道这个问题非常具有情境性,所以我将简要解释一下我的问题:

  • 许多活动触发了许多事件.
    • 关注,创建,喜欢,评论,编辑,删除等
  • 用户可以关注其他用户的活动(他们触发的事件).
  • 请求最多的活动将是最近发生的事件.
    • 需要查看过去事件的能力.
  • 根据日期描述,不需要对订阅源进行排序或搜索.
  • 可伸缩性是一个问题(性能和可扩展性).

对于平均时间,我结束了一个非标准化的设置基本上被由包括事件表的打算:id,date,user_id,action,root_id,object_id,object,data.

user_id是触发事件的人.
action是行动.
root_idobject属于的用户.
object是对象类型.
data包含在用户流中呈现事件所需的最少量信息.

然后,为了获得所需的事件,我只抓住所有行,其中user_id是用户的id,我们正在抓取它的流.

的工作原理,但非规范化只是感觉不对.多态关联看起来同样如此.Fanout似乎介于两者之间,但感觉非常混乱.

通过我对这个问题的所有搜索,并在这里阅读了很多关于SO的问题,我无法点击任何内容并感觉它是正确的解决方案.

我们非常感谢任何人提供的任何经验,见解或帮助.谢谢.

Den*_*rdy 2

我从未处理过社交活动源,但根据您的描述,它们与维护棘手的业务活动日志非常相似。

就我个人而言,我倾向于使用适用活动类型的单独表、每种类型的修订/日志表以及后者中的每个表来管理更中心的事件日志表。

后者允许构建提要,看起来很像您提出的解决方案:event_id、event_at、event_name、event_by、event_summary、event_type。(event_type 字段是一个 varchar,包含表或对象的名称。)

您可能不需要维护您案例中所有内容的历史记录(当然,这不太适合朋友请求,而不适合销售和库存变动),而是维护某种中央事件日志表(除了其他适用的表之外)我认为,手头有标准化数据)是正确的方法。

通过查看审核日志相关问题,您可能会得到一些有趣的见解:

https://stackoverflow.com/search?q=audit+log