我知道这个问题的变种已经问了很多次了(我已经看过其中2个:1,2),但是我就是无法理解任何一个看起来像正确解决方案的东西。
从多对多关系、扇出、多态关联、NoSQL解决方案、消息队列、去规范化以及它们的组合中提出了所有的建议。
我知道这个问题非常情境化,所以我会简要说明我的问题:
- 许多触发许多事件的活动 - 关注、创建、点赞、评论、编辑、删除等 - 用户可以关注另一个用户的活动(他们触发的事件)。 - 最受欢迎的活动将是最近的活动。 - 希望能够查看过去的事件。 - 并不希望在排序或搜索上耗费时间,只需按日期降序排序即可。 - 可扩展性是一个问题(性能和可扩展性)。
目前,我最终选择了一个非规范化设置,基本上由一个事件表组成:
然后,为了获取想要的事件,我只需要抓取所有行,其中
它“工作”,但是非规范化感觉不对。 多态关联似乎也是如此。 扇出似乎介于两者之间,但感觉非常混乱。
在研究了这个问题并阅读了 SO 上数不清的问题之后,我仍然无法找到任何解决方案让我感觉正确。
任何人能提供的经验、见解或帮助都将大大赞赏。谢谢。
从多对多关系、扇出、多态关联、NoSQL解决方案、消息队列、去规范化以及它们的组合中提出了所有的建议。
我知道这个问题非常情境化,所以我会简要说明我的问题:
- 许多触发许多事件的活动 - 关注、创建、点赞、评论、编辑、删除等 - 用户可以关注另一个用户的活动(他们触发的事件)。 - 最受欢迎的活动将是最近的活动。 - 希望能够查看过去的事件。 - 并不希望在排序或搜索上耗费时间,只需按日期降序排序即可。 - 可扩展性是一个问题(性能和可扩展性)。
目前,我最终选择了一个非规范化设置,基本上由一个事件表组成:
id
, date
, user_id
, action
, root_id
, object_id
, object
, data
。
user_id
是触发事件的人。action
是行为。root_id
是 object
所属的用户。object
是对象类型。data
包含呈现用户流中的事件所需的最少信息。然后,为了获取想要的事件,我只需要抓取所有行,其中
user_id
是正在获取其流的用户关注的用户的ID。它“工作”,但是非规范化感觉不对。 多态关联似乎也是如此。 扇出似乎介于两者之间,但感觉非常混乱。
在研究了这个问题并阅读了 SO 上数不清的问题之后,我仍然无法找到任何解决方案让我感觉正确。
任何人能提供的经验、见解或帮助都将大大赞赏。谢谢。