以适度可扩展的方式交付活动提要项目

2024-04-01

我正在开发的应用程序有一个活动源,每个用户都可以在其中看到他们朋友的活动(很像 Facebook)。我正在寻找一种适度可扩展的方式来动态显示给定用户的活动流。我说“适度”是因为我希望只用一个数据库(Postgresql)来做到这一点并且maybe内存缓存。例如,我希望此解决方案能够扩展到 20 万用户,每个用户有 100 个朋友。

目前,有一个主活动表,用于存储给定活动的渲染 html(Jim 添加了朋友,George 安装了应用程序等)。该主活动表保留源用户、html 和时间戳。

然后,有一个单独的(“连接”)表,它只保留一个指向应该在其朋友提要中看到此活动的人的指针,以及一个指向主活动表中的对象的指针。

因此,如果我有 100 个朋友,并且我进行 3 项活动,那么连接表将增长到 300 个项目。

显然这个表将会增长得非常快。不过,它有一个很好的特性,即向用户显示的获取活动需要单个(相对)便宜的查询。

另一种选择是只保留主活动表并通过如下方式查询它:

select * from activity where source_user in (1, 2, 44, 2423, ... my friend list)

这样做的缺点是您正在查询可能永远不会活跃的用户,并且随着您的朋友列表的增长,此查询可能会变得越来越慢。

我看到了双方的优点和缺点,但我想知道是否有一些人可以帮助我权衡选择并提出一种或另一种方式。我也愿意接受其他解决方案,尽管我想保持简单并且不安装 CouchDB 等之类的东西。

非常感谢!


我倾向于只拥有主活动表。如果你同意的话,这就是我会考虑实施的:

  1. 您可以创建多个活动表,并在从数据库获取数据时执行 UNION ALL。例如,每月滚动它们 - Activity_2010_02 等。仅以您的示例为例 - 20 万用户 x 100 个朋友 x 3 个活动 = 6000 万行。对于 PostgreSQL 来说,这不是性能方面的问题,但您可能会认为这纯粹是为了现在的方便,并最终是为了将来轻松扩展。

  2. This has the disadvantage that you're querying for users who may never be active, and as your friend list grows, this query can get slower and slower.

您要显示entire活动提要,回到最初的时代?您在原始问题中没有提供太多详细信息,但我猜测您会显示按时间戳排序的最后 10/20/100 个项目。几个索引和 LIMIT 子句应该足以提供即时响应(因为我刚刚在包含大约 2000 万行的表上进行了测试)。在繁忙的服务器上它可能会变慢,但这应该通过硬件和缓存解决方案来解决,Postgres 不会成为那里的瓶颈。

即使您确实提供了可以追溯到黎明之时的活动源,paginate输出! LIMIT 子句将拯救你。如果带有 LIMIT 的基本查询还不够,或者您的用户有一长串不再活跃的朋友,您可以考虑将查找限制为最后一天/一周/一个月first and then提供好友 ID 列表:

select * from activity 
  where ts <= 123456789 
    and source_user in (1, 2, 44, 2423, ... my friend list)

如果您有一个跨越数月或数年的表,则好友 ID 的搜索将仅在第一个 WHERE 子句选择的行中执行。

这只是我在您现在考虑的两种解决方案之间进行选择的情况。我也会看看这样的事情:

  1. 重新考虑表的非规范化。存储预先生成的 HTML 输出真的是最好的方法吗?通过使用活动查找表并动态生成模板化输出,您的性能会更好吗?预生成的 HTML 乍一看似乎更好,但考虑到磁盘存储、API、未来的布局更改和存储 HTML 等因素可能毕竟没有那么有吸引力。查找表可以包含您可能的活动 - 添加朋友、更改状态等,如果另一个用户参与该活动,活动日志将引用该活动以及朋友的 ID。

  2. Doing预生成 HTML,但不将其存储在数据库中。将内容保存在磁盘上作为预生成的页面。然而,这并不是灵丹妙药,很大程度上取决于网站上写入与读取的比率。 IE。公共论坛上的典型讨论线程可能有十几条消息,但可以被查看数百次 - 是缓存的良好候选者。然而,如果您的应用程序更适合即时状态更新,并且您必须在每几次视图后重新生成 HTML 页面并将其再次保存在磁盘上,那么这种方法就没有什么价值。

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以适度可扩展的方式交付活动提要项目 的相关文章

  • InnoDB 或 MyISAM - 为什么不两者都使用呢?

    我读过各种关于两者之间哪个更好的主题InnoDB and MyISAM 看来争论的都是使用还是其他 根据表的不同 是否不能同时使用两者 这样做会有什么缺点 据我所知 发动机可以在CREATE TABLE命令 因此 某些经常读取的表可以设置为
  • 如何杀死Mysql“show processlist”中的所有进程?

    因为我在那里看到了很多进程 并且 时间 列显示了所有进程的大值 大规模屠杀操作节省时间 在 MySql 本身中执行此操作 运行这些命令 mysql gt select concat KILL id from information sche
  • Node.js 和代码优先

    我使用代码优先方法开发实体框架 现在我正在学习 Node js 我想知道是否有一种方法可以使用 Node js 和一些库来实现相同的代码优先方法 我正在考虑使用MySql作为数据库 你可以看看续集 http docs sequelizejs
  • 通过分布式数据库聚合作业优化网络带宽

    我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
  • Python 中的 Firebase 身份验证时出现 KeyError:“databaseURL”

    相信你做得很好 我是 firebase 的新手 正在尝试进行用户身份验证 我已经安装了pyrebase4并在firebase控制台上创建了一个项目 我还启用了使用 电子邮件和密码 登录并尝试连接我的应用程序 下面是我正在尝试的代码 impo
  • 维护数据库表行的排序顺序

    假设我有一个数据库表 其中每行包含有关新闻文章的信息 该表有一个整数 排序 列 用于指示文章在网站上呈现的顺序 我如何最好地实施和维护这种排序顺序 我想避免的问题是文章编号为 1 2 3 4 100 当文章编号 50 突然变得有趣时 它的排
  • 将数据从 MS SQL 导入 MySQL

    我想从 MS SQL Server 导入数据 通过某种正则表达式运行它以过滤掉内容 然后将其导入 MySQL 然后 对于每个查询 我希望显示来自第三个数据库的相关图像 明智地导入和链接 最简单的方法是什么 谢谢 澄清 它是一个 PHP 应用
  • python 没有名为serial的模块

    我的 python 程序有问题 我编写了程序来将数据 温度 从 arduino 获取到我的树莓派 sqlite 数据库 但它在第 4 行 导入串行 处给了我一个错误 提示 ImportError 没有名为串行的模块 我使用 python3
  • IndexedDB - 对象存储与多个数据库与索引?

    我想知道什么时候使用单个数据库与具有多个对象存储的数据库是一个好主意 我阅读了网络上的大多数教程并查看了 indexedDB 的规范 但找不到比较这些不同概念的好例子 有没有人有此类事情的具体示例 使用多个对象存储和 或代码的设计模型 只要
  • 使用DBFlow,如何加密已经存在的数据库?

    我正在使用 DBFlow 来处理项目中的数据库 并且我想对现有数据库进行加密 我知道我可能必须删除现有的未加密数据库并创建另一个加密数据库 我也知道我可以将 SQLCipher 与 DBFlow 一起使用 如上所述文档 https gith
  • JSON 值的模式匹配

    运行 Postgres 12 5 的本地 docker 实例 4MBwork mem 我正在实施这个图案 https dba stackexchange com q 108447 3684搜索 json 中的任意字段 目标是搜索并返回 JS
  • 显示包含特定表的所有数据库名称

    我的 SQL Server 中有很多数据库 我必须只搜索包含特定表名的数据库名称Heartbitmaster 我有很多数据库 例如Gotgold DVD等 我只想从包含此表的查询中查找数据库名称Heartbitmaster 我搜索我尝试查询
  • 如何将数据库查询的行转换为 XML 文件?

    我正在开发一个 Delphi 应用程序 该应用程序需要从一段工作中获取行并将其转换为单个 XML 文件 以便上传到第三方 Web 服务 有没有可用的组件或库可以做到这一点 如果不是 那么构建 DB2XML 转换器的最佳代码方法是什么 我注意
  • 将 Access 数据库转换为 SQL Microsoft DTS - 数据类型“130”不在映射文件中

    我正在尝试将大型 Access mdb 数据库导出到 SQL Server 数据库 但遇到了 Microsoft DTS 无法识别 Access 数据库中特定类型字段的数据类型的问题 我查看了相关的访问表 它们被设置为长度为 1 的 文本
  • 使用 ActiveAndroid 库存储 HashMap

    我有一堂课 Table name Control public class Control extends Model Column private String name Column private Map
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 我应该定义索引(A)和索引(B),还是索引(A,B),或者两者都定义?

    在我的表中 我有两个密切相关的列 A 和 B 我应该考虑哪些因素来决定是否创建 索引 A 和索引 B 索引 A B 以上两者 如果我 仅使用类似的查询where A 5 and B 10 并且从不喜欢where A 5 也可以使用类似的查询
  • SQL Server 批量插入 - “批量加载数据转换错误”

    bulk insert dbo A FROM d AData csv WITH FIELDTERMINATOR ROWTERMINATOR n 将批量数据插入数据库时 在检查可疑数据后 我遇到了无法解释的错误 消息 4867 16 级 状态
  • 如何在 PostgreSQL 中使用条件和子查询创建唯一索引?

    我使用 PGSQL 并尝试添加下面的索引 CREATE UNIQUE INDEX fk client ON user client fk client WHERE fk client NOT IN SELECT fk client FROM
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz

随机推荐

  • 如何将我的 Magento 迷你搜索表单移动到模板标题中的另一个位置?

    我正在构建我的第一个自定义 Magento 主题 虽然进展缓慢 但是is去 我去掉了主页上最初保存迷你搜索表单的栏 而是想将搜索表单放入新标题中 这是我的标题的代码header phtml div a href title class lo
  • Kafka应用程序启动时无法配置主题,但稍后可以通信

    我们有一个使用 spring kafka 2 2 5 RELEASE 的 Spring Boot 应用程序 在启动时总是出现此错误 Could not configure topics org springframework kafka K
  • 如何对齐指针

    如何将指针与 16 字节边界对齐 我找到了这段代码 不确定是否正确 char p malloc 1024 if unsigned long p 16 0 unsigned char chpoint unsigned char p chpoi
  • pandas 在多列上搜索子字符串

    我有一个 df 这样 c name f name 0 abc abc12 1 xyz abc1 2 mnq mnq2 目标是在两列中找到一个子字符串并知道它属于哪一列 优先选择应该是c name 就像子字符串在两列中一样c name获得优先
  • 学习 XQuery 的简单工具? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始玩XQuery 在 w3schools 1 上 这是一个很好的教程 我只是遇到一些问题 我无法测试网站上的内容 我在网上找到了一个X
  • **正确地**从字符串创建 lambda 函数

    给定一个字符串 例如 2 i j lt 100 我想生成相应的lambda函数 fn lambda i j 2 i j lt 100 我可以这样做eval 但我正在寻找一种不那么邪恶的方法 我已经发现 import ast f ast La
  • Firebase 重置密码链接不起作用

    我正在使用 firebase 对我的 Android 应用程序中的用户进行身份验证 我为用户提供了在登录窗口中重置密码的选项 当用户单击按钮时 它会成功发送电子邮件 但是 当用户单击链接时 它总是显示 再次尝试重置密码 您重置密码的请求已过
  • 调用堆栈不说“你从哪里来”,而是说“你下一步要去哪里”?

    在上一个问题中 获取对象调用层次结构 https stackoverflow com questions 6583883 get object call hierarchy 我有这个有趣的答案 https stackoverflow com
  • 如何在 WPF 中拉伸位图而不平滑像素

    我正在开发用 WPF 编写的 SEM 图像处理应用程序 我有一个源自 Canvas 的图像显示控件 它使用 DrawingVisuals 显示图像和叠加层 每个 层 一个 它还使用应用于 DrawingVisuals 的缩放和平移变换来实现
  • 使用Imagemagick,如何裁剪白色背景?

    假设我有一个充满标志的目录 大约 200 个 每个标志都有这个边框 上下 12 像素 左右 1 像素 像这样 我如何使用 imagemagick 来 将每个 PNG 图像从 64x64 裁剪到 60x40 你有自动裁剪 mogrify tr
  • 程序类型已存在:com.google.common.util.concurrent.ListenableFuture 重复类

    我无法构建我的项目 因为我尝试添加的每个新依赖项都会充满新错误 我尝试使用 IDE 将我的项目迁移到 androidx 库 但这并没有解决任何问题 现在我有这些库 dependencies implementation fileTree d
  • 更新虚拟机选项后 Android Studio 无法启动

    我最近在运行 OSX 10 11 的 Mactop pro 上安装了 android studio 使用标准 Apple JRE JDK 我遇到了 IDE 速度慢和模拟器挂起的问题 经过一些研究后 建议我将 VM 选项设置为 Xmx2048
  • Symfony2 Jobeet 教程第 3 天错误无效映射

    当我用代码生成捆绑实体时 php app console doctrine generate entities EnsJobeetBundle 我收到这个错误 学说 通用 持久性 映射 映射异常 类 Ens JobeetBundle Ent
  • NullReferenceException 尝试读取连接字符串

    我有两个项目 一种是 Web 另一种是 Windows 窗体 Web项目连接到数据库 但Windows项目在读取连接字符串时抛出异常NullReferenceException 我使用相同的类来连接两个项目 使用 LINQTOSQL 建立连
  • Visual Studio Code clang 错误:Mac 上的链接器命令失败,退出代码 1

    我是编程新手 想尝试使用 VS Code 进行 C 开发 我收到此错误 但无法在线找到解决方案 clang 错误 链接器命令失败 退出代码为 1 使用 v 查看调用 终端进程终止并退出代码 1 我得到了一个包含函数定义的 cpp 文件和一个
  • 如何从字符串中删除“http://”部分?

    我有这个方法 private List
  • Facebook API:Instagram 帐户丢失

    每当创建或更新Ad很有创意 但我收到此错误 error message Invalid parameter type OAuthException code 100 error subcode 1772103 is transient fa
  • 在 AVPlayer 中播放网络状况不佳的流媒体

    当 AVPlayer 播放来自网络流的资源时 它会在到达下载内容的末尾时暂停 所以 我的问题是 如何知道它是因为网络不好而停止的 下载后如何播放 比如说 接下来的 10 秒资源 当 AVPlayer 的缓冲区为空时 您可以添加一个观察者 s
  • 如何替换不可打印的 unicode 字符 (Javascript)

    我已经浪费了大量的时间来处理字符串 由其他一些源生成 并且我发现问题在于字符串具有不可打印的字符 今天我正在处理 javascript 有谁知道如何替换javascript中不可打印的unicode字符 我在这里发现了类似的东西 如何在 J
  • 以适度可扩展的方式交付活动提要项目

    我正在开发的应用程序有一个活动源 每个用户都可以在其中看到他们朋友的活动 很像 Facebook 我正在寻找一种适度可扩展的方式来动态显示给定用户的活动流 我说 适度 是因为我希望只用一个数据库 Postgresql 来做到这一点并且may