社交媒体中的“点赞”“喜欢”是如何存储在数据库中的?

news2024/11/20 20:35:53

你有没有想过 Instagram、Twitter、Facebook 或任何社交媒体平台如何跟踪谁喜欢你的帖子?让我们在这篇文章中弄清楚!

1:序言

最近,我受邀在一个名为“CityJS”的活动中发言。但问题在于:我是 PHP 开发人员。我根本不懂JS,但我接受了挑战。为了成功,我需要找到一个很好的例子来展示高度可扩展和低延迟的数据库是如何工作的。

于是,我向我的一位同事寻求了例子。他告诉我要在任何平台上寻找高数字,例如计数器之类的东西。在那一刻,我意识到任何类型的度量标准都可以适用于这个例子。例如,点赞数、浏览量、评论数、关注数等都可以被查询为计数器。在这篇文章中,您将找到我对如何使用ScyllaDB进行适当的数据建模的研究。

2:让我们研究一下

要事第一,对吧?在决定了我的演讲要涵盖的内容之后,我需要了解如何构建此数据模型。

我们需要一个posts表格,还有一个post_likes表格来关联每个帖子的点赞者。到目前为止,似乎足以计算我们的喜好。

我第一次打赌计算所有喜欢的查询是这样的:

“好吧,如果我只是用SELECT count(*) FROM social.post_likes它做一个查询就可以了,对吧?”

好吧,它确实有效,但是当我在一篇文章中对几千个赞进行测试时,它的性能不如预期。随着点赞数的增加,查询变得越来越慢......

“但是 ScyllaDB 可以轻松处理数千行……为什么它的性能不佳?” 这可能就是您现在(或可能不是)的想法。

ScyllaDB——即使作为一个具有很酷功能的很酷的数据库——也不会解决糟糕的数据建模问题。我们需要考虑如何让事情变得更快。

3:研究数据类型

好的,让我们直接思考:数据需要存储,我们需要谁喜欢我们的帖子之间的关系,但我们不能用它来计数。那么,如果我integerposts表中创建一个新行并每次递增/递减它呢?

好吧,这似乎是个好主意,但有一个问题:我们需要跟踪 posts 表上的每个更改,如果我们开始在那里插入或更新数据,我们可能会在我们的数据库中创建一堆无意义的记录.

使用 ScyllaDB,每次您需要更新某些内容时,您实际上都会创建新数据。


scylla@cqlsh:socials> INSERT INTO socials.posts (id, user_id, description, image_url, created_at, likes) VALUES (4d18bb8c-9c57-44fe-827a-4a2d65f331e5, 3edd5f1d-67e9-4a3e-af1a-9adbb41e2129, 'Such a cool event P99 Conf!', 'https://i.imgur.com/Xp8gi7t.jpg', '2023-04-23 15:02:49', 1);

scylla@cqlsh:socials> INSERT INTO socials.posts (id, user_id, description, image_url, created_at, likes) VALUES (4d18bb8c-9c57-44fe-827a-4a2d65f331e5, 3edd5f1d-67e9-4a3e-af1a-9adbb41e2129, 'Such a cool event P99 Conf!', 'https://i.imgur.com/Xp8gi7t.jpg', '2023-04-23 15:02:50', 2);

scylla@cqlsh:socials> INSERT INTO socials.posts (id, user_id, description, image_url, created_at, likes) VALUES (4d18bb8c-9c57-44fe-827a-4a2d65f331e5, 3edd5f1d-67e9-4a3e-af1a-9adbb41e2129, 'Such a cool event P99 Conf!', 'https://i.imgur.com/Xp8gi7t.jpg', '2023-04-23 15:02:51', 3);
scylla@cqlsh:socials> SELECT * from posts;

 id                                 | user_id                           | created_at                    | description               | image_url                     | likes
--------------------------------------+--------------------------------------+---------------------------------+-----------------------------+---------------------------------+-------
 4d18bb8c-9c57-44fe-827a-4a2d65f331e5 | 3edd5f1d-67e9-4a3e-af1a-9adbb41e2129 | 2023-04-23 15:02:48.000000+0000 | Such a cool event P99 Conf! | https://i.imgur.com/Xp8gi7t.jpg |    1
 4d18bb8c-9c57-44fe-827a-4a2d65f331e5 | 3edd5f1d-67e9-4a3e-af1a-9adbb41e2129 | 2023-04-23 15:02:50.000000+0000 | Such a cool event P99 Conf! | https://i.imgur.com/Xp8gi7t.jpg |    2
 4d18bb8c-9c57-44fe-827a-4a2d65f331e5 | 3edd5f1d-67e9-4a3e-af1a-9adbb41e2129 | 2023-04-23 15:02:51.000000+0000 | Such a cool event P99 Conf! | https://i.imgur.com/Xp8gi7t.jpg |    3

您将必须跟踪数据中发生的所有变化。因此,每次增加,都会多一行,除非您不更改集群键或不关心时间戳(一个非常愚蠢的想法)。

在那之后,我进入了ScyllaDB 文档,发现有一种类型叫做counter满足我们的需要并且也是ATOMIC!

好的,它符合我们的需求但不符合我们的数据建模。要使用这种类型,我们必须遵循一些规则,但让我们关注那些现在给我们带来麻烦的规则:

  • 在具有计数器列的表中,唯一允许的其他列是主键列(不能更新)。

  • 不允许包含任何其他类型的列。

  • 必须使用 UPDATE 查询处理拥有计数器数据类型的表。

  • 你只能增加或减少值,不能设置特定的值。

  • 通过不允许在同一操作中处理计数器和非计数器更新,此限制确保了对计数器和非计数器更新的正确处理。

所以,我们可以使用这个计数器,但不能用在 posts 表上……好吧,看来我们正在寻找一种方法来完成它。

4:正确建模

counter有了类型不应与表中的其他数据类型“混合”的信息,留给我们的唯一选择是创建一个新表并存储这种类型的数据。

所以,我创建了一个名为的新表post_analytics,它只包含counter类型。目前,让我们只处理喜欢,因为我们已经创建了多对多关系 (post_likes)。

这些接下来的查询是您可能会为我们创建的这个示例运行的查询:


## Social when you like a post

UPDATE socials.post_analytics SET likes = likes + 1 WHERE post_id = 4d18bb8c-9c57-44fe-827a-4a2d65f331e5;

INSERT INTO socials.post_likes (post_id, user_id, liked_at) VALUES (4d18bb8c-9c57-44fe-827a-4a2d65f331e5, 3edd5f1d-67e9-4a3e-af1a-9adbb41e2129, '2023-04-23 15:02:50');

# Social when you dislike a post

DELETE FROM socials.post_likes WHERE post_id = 4d18bb8c-9c57-44fe-827a-4a2d65f331e5 AND user_id = 3edd5f1d-67e9-4a3e-af1a-9adbb41e2129;

UPDATE socials.post_analytics SET likes = likes - 1 WHERE post_id = 4d18bb8c-9c57-44fe-827a-4a2d65f331e5;

现在你可能会有新的未解决问题,比如:“那么每次我需要一个与某些数据相关的新计数器,我都需要一个新的表吗?”好吧,这取决于你的用例。在社交媒体的情况下,如果你想要存储谁看过这篇文章,你可能需要一个post_viewers表,其中包含session_id和一些其他内容。

使用这些可以在不需要连接的情况下完成的简单查询可能比使用count(*)查询更快。


作者:Daniel Reis

更多技术干货、热门资讯请关注公号“云原生数据库”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/516414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Palo Alto Networks利用基于机器学习的自动化网络安全解决方案

“ Palo Alto Networks利用第三代英特尔至强可扩展处理器和部署在云中的英特尔软件,为其云端安全服务提供强有力的支持,从而提升机器学习和推断的性能。 面对恶意软件攻击的快速演变和难以捉摸的特性,企业网络安全团队面临着巨大的挑战。恶意…

"五步走"的MES系统改进战略,让ERP不再是面子工程

随着制造业信息化进程的不断推进,大部分的制造业企业都开始意识到,生产技术的领先和生产流程的有效管理是其发展的重要一环,有些企业已经或者正在实施的 ERP系统。但是,从相关部门的数据来看, ERP在分散型制造业企业中…

算法(一)—— 回溯(1)

文章目录 前言1 77 组合2 77 组合优化 前言 1、回溯法解决的问题都可以抽象为树形结构(N叉树),使用树形结构来理解回溯。 2、回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度&#xff…

FPGA基于GS2971/GS2972实现SDI视频收发 提供工程源码和技术支持

目录 1、前言2、我目前已有的SDI编解码方案3、GS2971/GS2972芯片解读GS2971解读GS2972解读 4、详细设计方案5、vivado工程1解读硬件逻辑工程软件SDK工程 6、vivado工程2解读硬件逻辑工程软件SDK工程 7、上板调试验证8、福利:工程代码的获取 1、前言 FPGA实现SDI视频…

多尺度深度特征(上):多尺度特征学习才是目标检测精髓(干货满满,建议收藏)...

计算机视觉研究院专栏 作者:Edison_G 深度特征学习方案将重点从具有细节的具体特征转移到具有语义信息的抽象特征。它通过构建多尺度深度特征学习网络 (MDFN) 不仅考虑单个对象和局部上下文,还考虑它们之间的关系。 公众号ID|ComputerVisionG…

零售行业公有云信息安全探讨

新钛云服已累计为您分享744篇技术干货 ⚠️公有云安全事件⚠️ 最近小半年接连处理了几起零售行业公有云安全事件,都是因为某种原因造成的数据泄露。有防护措施不当的,也有因为应用漏洞泄露被黑的,也有内部人员不慎造成的。 事后总结发现主要…

第一章 IRIS 基础知识:使用互操作性制作连接系统

文章目录 第一章 IRIS 基础知识:使用互操作性制作连接系统为什么要连接系统?介绍Productions 第一章 IRIS 基础知识:使用互操作性制作连接系统 本文介绍了如何将系统与 IRIS 数据平台互操作性产品连接在一起。 为什么要连接系统&#xff1f…

Golang每日一练(leetDay0063) 最大数、重复的DNA序列

目录 179. 最大数 Largest Number 🌟🌟 187. 重复的DNA序列 Repeated DNA Sequences 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

博客管理系统--博客列表页

准备工作设计数据库封装数据库操作创建实体类数据库增删查改操作(写法几乎很相似)前后端交互 准备工作 博客管理系统前端部分在学习前端、css、js部分实现;现在我们将完成后端工作;并且部署云服务上;使其能让所有联网的人使用。 …

【代码】一个LVQ神经网络的详解实例

本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com LVQ神经网络是用于样本分类的一个常用算法,本文先简单回顾LVQ神经网络是什么,然后展示如何用matlab工具箱来训练一个LVQ神经网络 目录 一. LVQ神经网络简介 1.1 LVQ神经…

“首次公开一年连升两级的晋升大法”!

见字如面,我是军哥! 今天把江湖上失传已久的技术人晋升大法分享给各位,据说当年雷jun总就是用了此法三年就干到了技术高管,请各位务必做好学习和分享动作。 说真的,用好这三个办法,就算在 IT 大厂一年都可以…

脑挫裂伤是什么?脑挫裂伤的4大症状要警惕!

脑挫裂伤是头部遭受暴力而引起的原发性脑器质性损伤。脑挫裂伤既可发生于着力点的脑组织,也可发生于对冲部位。脑挫裂伤病人的临床表现可以由于损伤部位,范围,程度的不同而有差异。受伤较轻的可以只有轻微的症状而受伤,较重的可以…

这玩意真的有用吗?对,是的!Kotlin 的 Nothing 详解

视频先行 下面是视频内容的脚本文案原稿分享。 文案原稿 Kotlin 的 Nothing 类,无法创建出任何实例: public class Nothing private constructor() 所以所有 Nothing 类型的变量或者函数,都找不到可用的值: val nothing: Nothing …

电脑视频录屏软件哪个好用 电脑视频录屏怎么录屏

录屏是我们的工作和生活中非常大的一个需求,尤其对于专业的视频制作者来说,经常需要录制屏幕和编辑视频,因此找到便捷好用的录屏软件非常重要。今天就来分享一下电脑视频录屏软件哪个好用,电脑视频录屏怎么录屏。 一、电脑视频录…

2023 年第八届数维杯大学生数学建模挑战赛 B 题 节能列车运行控制优化策略

在城市交通电气化进程快速推进的同时,与之相应的能耗增长和负面效应也 在迅速增加。城市轨道交通中的快速增长的能耗给城轨交通的可持续性发展带来 负担。2018 年,北京、上海、广州地铁负荷占全市总负荷的 1.5%-2.5%,成为了 城市电网的最大单体负荷[1]。…

软考A计划-真题-分类精讲汇总-第一章(计算机组成原理与体系结构)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

Java每日一练(20230512) 最大间距、串联子串、最长回文子串

目录 1. 最大间距 🌟🌟🌟 2. 串联所有单词的子串 🌟🌟🌟 3. 最长回文子串 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 …

c++ 11标准模板(STL) std::vector<bool> (二)

定义于头文件 <vector> template<class Allocator> class vector<bool, Allocator>; std::vector<bool> 是 std::vector 对类型 bool 为空间提效的特化。 std::vector<bool> 中对空间提效的行为&#xff08;以及它是否有优化&#xff09;是实现…

使用ChatGPT完成部门和个人季度工作总结

“疫后元年“2023年的第一季度即将过去&#xff0c;相信各位社会人们都过得比往年更加紧张充实吧&#xff1f;转眼又到了完成季度工作总结的时间&#xff0c;完成本职工作之余还要抽出专门的时间完成优秀的工作总结报告&#xff0c;又更让大家本不富裕的休息时间雪上加霜。那么…

SCS【24】单细胞数据量化代谢的计算方法 (scMetabolism)

桓峰基因公众号推出单细胞生信分析教程并配有视频在线教程&#xff0c;目前整理出来的相关教程目录如下&#xff1a; Topic 6. 克隆进化之 Canopy Topic 7. 克隆进化之 Cardelino Topic 8. 克隆进化之 RobustClone SCS【1】今天开启单细胞之旅&#xff0c;述说单细胞测序的前世…