postgresql 实践

postgresql 实践

ID:25219563

大小:54.00 KB

页数:10页

时间:2018-11-18

postgresql 实践_第1页
postgresql 实践_第2页
postgresql 实践_第3页
postgresql 实践_第4页
postgresql 实践_第5页
资源描述:

《postgresql 实践》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、PostgreSQL实践-内容社区(如论坛)图式搜索应用作者digoal日期2017-10-09标签PostgreSQL,图数据库,论坛搜索,推荐,数组,smlar相似搜索背景通常一个内容社区网站可能需要记录这么一些数据:文章,用户,标签。还有三者之间的关系,包括,文章的标签,用户阅读了文章,用户收藏了文章,用户关注了某用户,用户是某篇文章的作者。最终要实现毫无人道的查询,例如:阅读了此篇文章的人还在阅读什么其他文章,和我爱好相近的人都有哪些等等等等。其中文章数量几千万,用户数量接近一千万。http://ww

2、w.htdxj.cn如何实现这样的需求呢?实际上PostgreSQL里面的数组、smlar实现这个需求非常的方便。下面开始设计和压测。数组用于存储正向和反向关系,标签等。smlar用于查询相似的数组(找出爱好相似的人)。设计元数据1、用户表createtableusers(uidintprimarykey,--用户IDinfotext,--附加信息crt_timetimestamp--时间);2、标签表createtabletags(tagidintprimarykey,--标签IDinfotext,--附加

3、信息crt_timetimestamp--时间);3、文章表createtablearts(artidintprimarykey,--文章IDinfotext,--附加信息、内容uidsint[],--用户IDs(作者可能是多人,所以使用数组)tagsint[]--标签);关系数据1、正向关系1.1、文章被谁看过createtableart_uids_view(artidintprimarykey,uidsint[]);1.2、文章被谁收藏过createtableart_uids_like(artidintp

4、rimarykey,uidsint[]);2、反向关系2.1、用户看过哪些文章,包含哪些标签createtableuid_arts_view(uidintprimarykey,artsint[],tagsint[]);2.2、用户收藏了哪些文章,包含哪些标签createtableuid_arts_like(uidintprimarykey,artsint[],tagsint[]);查询1、阅读了此篇文章的其他人还在阅读什么其他文章,(过滤当前文章、以及我阅读过的文章)。逻辑如下,写成UDF即可:createe

5、xtensionintarray;--创建intarry插件,简化数组的加减select(uids-$current_uid)intov1fromart_uids_viewwhereartid=$current_artid;--取出阅读了当前文章的所有用户(减去当前用户)select(unnest(arts)asarts,count(*)ascnt)intov2fromuid_arts_viewwhereuid=any(v1)groupby1;--获取阅读了同样文章的人,还阅读了哪些文章selectartsi

6、ntov3fromuid_arts_viewwhereuid=$current_uid;--当前用户阅读了哪些文章result=v2.arts-v3;--其他人阅读的所有文章减去当前用户阅读的文章,得到其他人阅读的文章。按重叠数从大到小排序,推荐给用户UDF如下,都能使用索引,都是聚合后的点查,性能很赞:createorreplacefunctionrec_arts_view(i1int,--文章IDi2int,--当前用户IDi3int--limit)returnssetofintas$$declarere

7、sint[];--结果v1int[];--文章被哪些用户阅读了begin--文章被哪些用户阅读了select(uids-i2)intov1fromart_uids_viewwhereartid=i1;--阅读了这篇文章的其他用户,阅读了哪些文章,排除当前用户已阅读的,按重复率排序,返回N条。--如果阅读了该文章的其他人,还阅读了很多其他文章,排序可能会略耗时。returnqueryselectt1.artsfrom(selectunnest(arts)arts,count(*)cntfromuid_arts_

8、viewwhereuid=any(v1)groupby1)t1leftjoin(selectunnest(arts)arts,1cntfromuid_arts_viewwhereuid=i2)t2on(t1.arts=t2.arts)wheret2.*isnullorderbyt1.cntdesclimiti3;end;$$languageplpgsqlstrict;2、与我(阅读文章)爱好相近的人

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。