当前位置: 首页 > news >正文

dw怎么做phpcms网站北京信息网站建设

dw怎么做phpcms网站,北京信息网站建设,免费商城小程序模板,汕头模板自助建站关注关系产生的四种关系状态 关注粉丝双向关注(互粉)无关系用词follower表示粉丝 -- 追随者 用词following表示关注 -- 追随 设计的结构必须能满足以下功能#xff1a; 查询关注列表查询粉丝列表查询双向关注列表判断两个用户的关系查询带关系状态的任一列表第一种方案 用一行… 关注关系产生的四种关系状态 关注粉丝双向关注(互粉)无关系用词follower表示粉丝 -- 追随者 用词following表示关注 -- 追随 设计的结构必须能满足以下功能 查询关注列表查询粉丝列表查询双向关注列表判断两个用户的关系查询带关系状态的任一列表第一种方案 用一行纪录表示关注和粉丝字段u2的值表示粉丝u1表示被关注者。 Table: user(用户表) Table: follower(u2表示粉丝 u1表示被关注的人) 查询用户id 1的关注列表 SELECT * FROM follower WHERE u2 1 查询用户id 1的粉丝列表 SELECT * FROM follower WHERE u1 1 查询用户id 1的双向关注列表 SELECT t1.* FROM (SELECT * FROM follower WHERE u2 1) AS t1 INNER JOIN follower t2 ON t1.u1 t2.u2 LIMIT 10 判断两个用户的关系(id 1 -- id 5) SELECT * FROM follower WHERE (u2 1 or u1 1) AND (u2 5 or u1 5) LIMIT 3 id 1的用户查询所有 id 5的用户并显示关系 如上图所示要查询的用户的那个圈被分成了四个部分上面讲的四种状态 关注了我的用户和我互粉的用户我关注了的用户我未关注的用户以上复杂的集合关系通过单一SQL根本无法实现。 要查询的用户与粉丝集合的交集: SELECT * FROM (SELECT * FROM user WHERE id 5) AS t1 INNER JOIN(SELECT * FROM follower WHERE u1 1) AS t2ON t1.id t2.u2 要查询的用户与关注集合的交集: SELECT * FROM (SELECT * FROM user WHERE id 5) AS t1 INNER JOIN(SELECT * FROM follower WHERE u2 1) AS t3ON t1.id t3.u1 其他的部分可以通过以上两步查询出来的数据在内存中作计算得出。 因为关注关系是互相的用一行纪录即可表示。以上的设计其实是把关注和粉丝的概念用一行纪录表达。这样会引来一个缺点当follower非常大的时候对follower表进行分片如果按u1或者u2分片假设按u1分片那么将导致关注列表即下面的查询要做聚合。 SELECT * FROM follower WHERE u2 1 选择u1分片后u2 1的数据行将会落到不同的分片上。 SELECT * FROM follower_0 WHERE u2 1 UNION SELECT * FROM follower_1 WHERE u2 1 而粉丝列表的查询不会受影响同一个用户的所有粉丝分在一个片上。 SELECT * FROM follower_1 WHERE u1 1 如果按u2分片同样也会导致粉丝列表会落在不同的分片上。两个查询不可能同时满足分片。 如果分片是跨数据库或者是跨主机的方案问题会变得更复杂。 针对方片的优化方案 可以用冗余数据的办法来解决数据分片带来的问题即将关注和粉丝分2个表存放。 用follower表存放粉丝 用following表存放关注 当用户Ub关注Ua分别往follower, following写入一行纪录。 Ua - Ub 只是他们表示的含义不同。 follower表示Ua的粉丝是Ub following表示Ub关注Ua 分片的时候同时对follower和following进行分片。同时上面分析的所有查询方法也要相应改变思路还是一样只是单个表的自联接变成2个表的联接。 以上方案缺点就是数据量会增加一倍进行关注或者取消关注的写操作会多一次要同时维护2个表的数据。 以上优化虽然解决了一些问题但同时也带来一些问题。可见关系型数据库在处理用户关系的时候表现得很吃力。我们不得不承认虽然叫“关系”型数据库却不太懂得处理集合关系。 另一种方案 还有一种方案即用一行纪录表示出两个用户之间的所有关系此方案能节省很大的数据空占用。 字段: u1, u2, type type1 表示u2关注u1 type2 表示u1,u2互相关注 type0 表示u1,u2无关系(默认) 保证插入数据时u1是被关注者u2是粉丝当然你也可以换过来只是逻辑会变了 每次写入数据时要检查当前的状态 如果u1(1) - u2(2)纪录已经存在u2已经关注u1这个时候u1再关注u2只需要将type字段的值变为type 2。 如果u1(1) - u2(2) type(2)时即u1和u2互相关注如果有一个人取消关注问题会很复杂最坏的情况要修改整行纪录交换u1,u2这两个字段的值再修改type1。 同时上面的方案查询也会变化。例如要查询id 1的粉丝列表 SELECT * FROM table WHERE u1 1 OR (u2 1 AND type 2) 例如要查询id 1的关注列表 SELECT * FROM table WHERE u2 1 OR (u1 1 AND type 2) 上面的方案只强调关注关系双向关系只是在单一关系上用字段区分关注的先后关系很明显事务性更强。 查询id 1的双向关注 SELECT * FROM table WHERE type 2 AND (u1 1 OR u2 1) 这个方案虽然节省数据空间但是不容易理解而且写入时每次要检查判断当前的关系逻辑上过于复杂。而且数据量大后由于查询WHERE条件同时有u1和u2很难进行分片。 其他一些问题 ua与ub的共同关注列表ua与ub的共同粉丝列表ua的关注列表里谁关注了ub以上的关系计算大家可能很容易理解但要在MySQL里实现是非常难的。 id 3与id 2的共同关注列表 SELECT u1, COUNT(id) AS num FROM follower WHERE u2 3 OR u2 2 GROUP BY u1 HAVING num 1 id 3与id 1的共同粉丝列表 SELECT u2, COUNT(id) AS num FROM follower WHERE u1 3 OR u1 1 GROUP BY u2 HAVING num 1当然你可以用集合的方法查询: SELECT t1.u2 FROM (SELECT u2 FROM follower WHERE u1 3) AS t1INNER JOIN (SELECT u2 FROM follower WHERE u1 1) AS t2ON t1.u2 t2.u2 id 1的关注列表里谁关注了id 5 SELECT u2 FROM (SELECT u2 FROM follower WHERE u1 2) AS t1 INNER JOIN (SELECT u1 FROM follower WHERE u2 1) AS t2 ON t2.u1 t1.u2 转载于:https://www.cnblogs.com/JockChou/p/4643649.html
http://www.pierceye.com/news/876900/

相关文章:

  • 如何制作网站图片帮忙做网站
  • 高端做网站公司网络信息安全公司
  • 手机网站图片自适应建设网站用的软件
  • wordpress postid随机苏州百度推广排名优化
  • 重庆企业网站推广服务做性的网站
  • asp.net 创建网站登陆建设银行网站异常
  • 柳州网站建设柳州wordpress 创建文集
  • 怎样把网站做成app多语言网站建设方案
  • 中国最新新闻头条南通百度网站快速优化
  • 乐清网站推广制作长沙银狐做网站
  • 做企业网站需要多久论坛网站推广方案
  • 郑州网站优化排名wordpress搭建本地博客
  • 如何获取网站域名证书刚刚北京传来重大消息
  • 找别人做淘客网站他能改pid吗现在中型公司做网站用的是什么框架
  • 泉州晋江网站建设费用海南建设银行官网招聘网站
  • 自己给公司做网站郑州工程建设信息网站
  • 单页网站建站外贸公司网站怎么设计更好
  • 滨州建设工程备案网站网站制作九江
  • 北京网站制作业务如何开展全屋整装定制
  • 网站seo博客刷百度关键词排名
  • 制作企业网站的代码馆陶专业做网站
  • 网站建设简介联系方式PHP 网站开发 重点知识
  • 网页设计网站排行榜浅谈一下网络营销的几个误区
  • 上海网站制作公司报价中国十大咨询公司
  • 软件开发和网站建设哪个好dede网站本地访问速度慢
  • 平安建设网站做写手哪个网站好
  • 服务器硬件影响网站速度网站链接优化
  • 商品网站建设格式最火的做网站源码语言
  • 商城建站系统多少钱商标网官方查询官网
  • 织梦网站怎么做备份昆明航空公司官方网站