Mysql活动提要设计

Posted

技术标签:

【中文标题】Mysql活动提要设计【英文标题】:Mysql activity feed design 【发布时间】:2013-09-26 23:19:22 【问题描述】:

在我的应用程序中,用户可以创建项目(上传他们的照片/图像)、欣赏其他用户项目或将其添加到收藏夹、写消息、留下 cmets。还有活动提要,每个用户都可以看到新的 cmets、新消息、朋友的新项目等。

活动提要中的每条记录都可以与不同的对象相关联。例如,new_vote 类型的记录可以连接到VoteProjectSender(谁投票)。每条记录都有owner。我有以下表格(简单地说):

feed (id, owner_id, sender_id, project_id, vote_id, message_id, comment_id, type)
projects (id, title)
votes (id, vote)

等等

我希望每条记录都与多个对象相关。例如,new_message 类型的记录可以与多条消息相关。所以在活动提要页面上,我可以向用户显示“迈克给你写了 4 条消息”。在我看来,它将是:

feed (id, type)
projects (id, title)
votes (id, vote)
feeds_projects_relations (feed_id, project_id)
feeds_votes_relations (feed_id, vote_id)

和其他类似的表格。

这是正确的设计吗?有更好的方法吗?

谢谢。

【问题讨论】:

您可能还需要考虑是否要将用户照片图像数据作为带有 BLOB 字段的单独表包含在数据库中,因为当您回滚事务时,文件系统上的文件不会被删除/更改,假设你正在使用 InnoDB。 @RaymondNijland,我不确定。图片是我网站上的主要内容,它是内容。将所有这些文件保存在数据库中是个好主意吗? 可能取决于应用程序/硬件/mysql 配置/使用的存储引擎/ .. 在文件系统上存储表和文件中的路径有一个优势,这应该更快地写入文件,但是当您需要时获取一个文件,您需要根据路径执行数据库请求和文件系统请求....如果您将文件存储到数据库中,写入文件可能会比文件系统慢,但获取文件是一个简单的内部连接,文件流将发送到 php 客户端可能会更快...但您确实需要对此进行基准测试 此外,当我请求图像文件时,python 脚本必须从数据库中获取它,然后将其发送给用户。不要想的快。现在我的服务器直接发送文件。 注意旧文档。arxiv.org/ftp/cs/papers/0701/0701168.pdf (2006) 或 faculty.jacobs-university.de/pbaumann/iu-bremen.de_pbaumann/… (2008) 数据库服务器的速度也在提高。 【参考方案1】:

您在设计数据库时假设从提要到投票之间存在多对多关系。真的吗?我会假设每张投票只与一个提要有关。在这种情况下,不要使用 feeds_votes_relations 表,只需将 feed_id 添加到您的投票表中以指向它所在的提要。

我也想知道 feed 是否是正确的表名。我认为提要是一个集合或组。通常,您希望您的表格保存单个对象,例如 vote 或 project,并将表格命名为 votes 或 projects。

【讨论】:

我有表 projects 用于项目,表 votes 用于投票等。我将提要记录保存在名为 feeds 的单独表中。在某些情况下,几票可能与提要有关。例如,2 个用户可以为项目投票,我想显示用户“Mike L. 和 Jennie K. 为您的项目投票。投票数是:Mike 9.5,Jennie 7.9”。并且还有其他记录有many2many。有人可以给我发 5 条消息,3 个用户可以为我的项目添加 5 个 cmets 等等。我想知道,这是好的设计吗? @krasulya 这听起来仍然像投票是一对多的。一个项目可以有很多票,但每票只能投给一个项目。 哦,我明白了。 Vote 只能与一个feed 有关系,没错。但我不想让vote 模型知道关于feed 的任何事情。我希望feed 独立。

以上是关于Mysql活动提要设计的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 MS 团队中发送活动提要通知?

使用 PHP 和 MySQL 的通知/新闻提要

社交应用程序的数据库设计和优化注意事项

Facebook 中的新闻提要数据库设计

视图 VS 表 对于“facebook”之类的提要

在 ElasticSearch 中存储新闻提要的最佳设计模式