在写之前,先说说当前的系统架构吧

spring cloud + zuul + eureka + oauth2 + redis + rabbitMq

这个系统是由我搭建的,当时采用的springCloud 版本 Finchley,这点是因为它支持springBoot2.0

注*

网关选zuul是因为当时对zuul比gateway更了解,而且用户量不是很大,现在zuul也遇到了问题,在考虑转gateway

RPC框架选eureka也是基于了解的情况选的,现在不更新了,以后会转Nacos

现有设计到的技术就上面那些了,很简陋.因为服务器采用的阿里云服务器,所以尽量在不扩展技术的情况下去做.

技术就说到这,接下来就是设计数据库表了 (最初版本:可能不是完整的字段)

首先是数据存储表:

CREATE TABLE `activity_record` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '动态id',
  `user_id` varchar(32) NOT NULL DEFAULT '' COMMENT '人员主键',
  `content` longtext NOT NULL COMMENT '内容',
  `time` datetime NOT NULL COMMENT '时间',
  `hot_spot_f` varchar(20) NOT NULL DEFAULT '' COMMENT '热点1',
  `hot_spot_s` varchar(20) NOT NULL DEFAULT '' COMMENT '热点2',
  `hot_spot_t` varchar(20) NOT NULL DEFAULT '' COMMENT '热点3',
  `dept_id` varchar(32) NOT NULL DEFAULT '' COMMENT '部门id',
  `is_delete` tinyint(1) NOT NULL DEFAULT 0 COMMENT '删除标志',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COMMENT='个人动态表';

CREATE TABLE `activity_like_record` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` varchar(32) NOT NULL COMMENT '用户id',
  `activity_id` int(11) NOT NULL COMMENT '动态id',
  `create_time` datetime DEFAULT NULL COMMENT '点赞时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT='点赞记录表';

CREATE TABLE `activity_comment` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `comment_info` varchar(400) DEFAULT NULL COMMENT '评论内容',
  `comment_time` datetime DEFAULT NULL COMMENT '评论时间',
  `parent_id` int(11) DEFAULT NULL COMMENT '父级评论id',
  `lev` tinyint(3) DEFAULT NULL COMMENT '评论等级',
  `user_id` varchar(32) DEFAULT NULL COMMENT '评论人',
  `activity_id` int(11) DEFAULT NULL COMMENT '动态id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='评论表';

CREATE TABLE `activity_annex` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `annex_info` varchar(300) DEFAULT NULL COMMENT '附件信息',
  `annex_url` varchar(300) DEFAULT NULL COMMENT '附件路径',
  `annex_type` varchar(50) DEFAULT NULL COMMENT '附件类型',
  `activity_id` int(11) NOT NULL COMMENT '动态id',
  `sort` int(4) DEFAULT NULL COMMENT '排序',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COMMENT='动态附件表';

CREATE TABLE `activity_record_draft` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '动态id',
  `user_id` varchar(32) NOT NULL DEFAULT '' COMMENT '人员主键',
  `content` longtext NOT NULL COMMENT '内容',
  `time` datetime NOT NULL COMMENT '时间',
  `hot_spot_f` varchar(20) NOT NULL DEFAULT '' COMMENT '热点1',
  `hot_spot_s` varchar(20) NOT NULL DEFAULT '' COMMENT '热点2',
  `hot_spot_t` varchar(20) NOT NULL DEFAULT '' COMMENT '热点3',
  `dept_id` varchar(32) NOT NULL DEFAULT '' COMMENT '部门id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT='个人动态草稿表';

CREATE TABLE `activity_annex_draft` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `annex_info` varchar(300) DEFAULT NULL COMMENT '附件信息',
  `annex_url` varchar(300) DEFAULT NULL COMMENT '附件路径',
  `annex_type` varchar(50) DEFAULT NULL COMMENT '附件类型',
  `draft_id` int(11) NOT NULL COMMENT '动态id',
  `sort` int(4) DEFAULT NULL COMMENT '排序',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COMMENT='草稿动态附件表';

然后到了业务辅助表了,首先聊聊朋友圈架构设计(参考微信架构师许家滔在QCon北京2014上的演讲“微信后台存储架构”)

这里面有一个重要的思想: 时间轴-- 记录本人能看到的所有动态的时间线.

举个例子: 在做的时候原本思维是这样子的

在获取本人能看到的动态,需要查本人所有好友的动态后进行时间排序. 这个对时间复杂性了解的人应该知道在不考虑排序下时间复杂度是O(n)*O(m)

如果添加时间线的概念

针对于每个人都维护了一个时间线那么在任何情况下的时间复杂度都是 O(n) 但 空间上也多了O(n). 但多了个存储.

这是典型的空间换时间的思想

但在针对于公司内部动态中,动态都是可见的,所以在空间上还需要针对其它因素建立:

时间轴表:

CREATE TABLE `activity_timer` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `time` datetime NOT NULL COMMENT '时间',
  `activity_id` int(11) DEFAULT NULL COMMENT '动态id',
  `timer_type` tinyint(3) DEFAULT NULL COMMENT '时间轴类型 (主时间轴,个人时间轴,热点时间轴)',
  `timer_rel` varchar(32) DEFAULT NULL COMMENT '时间轴关联对象',
  PRIMARY KEY (`id`),
  KEY `type_rel` (`timer_type`,`timer_rel`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COMMENT='时间轴表';

对于朋友圈扩展的热点:

CREATE TABLE `activity_hot_spot` (
  `id` int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `hot_spot` varchar(10) NOT NULL DEFAULT '' COMMENT '热点',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `UN_HOT_SPOT` (`hot_spot`) USING HASH
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT = "热点";

热点模糊查询优化:

CREATE TABLE `activity_hot_spot_index` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `index_info` varchar(20) DEFAULT NULL COMMENT '索引字段',
  `hot_spot_id` int(11) DEFAULT NULL COMMENT '索引id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4 COMMENT='热点索引表';

在此相关表设计完. 接下来就是流程设计

并不是很详细 以后补全 .

这块是设计思想,不是实际实现路线,

这边App那边是Java + kotlin 混合编写,而且对app缓存玩的不是很好,所以所有压力都塞给服务器.所以没有读取本地缓存这个步骤,所以缓存只有后端redis缓存

  

有关类朋友圈设计(3) -- 数据库设计&现有技术&流程设计的更多相关文章

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ...

  2. 2017.11.5 Java Web ----案例:数据库访问JavaBean的设计

    (12)案例----数据库访问JavaBean的设计 例题:数据库操作在一个Web应用程序中的后台处理中占有大比重,设计一组JavaBean封装数据库的基本操作供上层模块调用,提高程序的可移植性. [ ...

  3. 深度解读MRS IoTDB时序数据库的整体架构设计与实现

    [本期推荐]华为云社区6月刊来了,新鲜出炉的Top10技术干货.重磅技术专题分享:还有毕业季闯关大挑战,华为云专家带你做好职业规划. 摘要:本文将会系统地为大家介绍MRS IoTDB的来龙去脉和功能特 ...

  4. MRS IoTDB时序数据库的总体架构设计与实现

    MRS IoTDB时序数据库的总体架构设计与实现 MRS IoTDB是华为FusionInsight MRS大数据套件最新推出的时序数据库产品,其领先的设计理念在时序数据库领域展现出越来越强大的竞争力 ...

  5. QQ空间/朋友圈类界面的搭建

    类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...

  6. iOS版微信朋友圈数据库的简要分析

    本文版权归cxun所有,如有转载请注明出处与本文链接,谢谢!原文地址:http://www.cnblogs.com/cxun/p/4550523.html 之前写了一些关于微信聊天记录的博文之后,不少 ...

  7. Visor 应用之一 通过ER 设计生成数据库脚本和实体对象

    前言 Visor(http://www.visor.com.cn)   是一个基于HTML5 Canvas 开发的IDE 框架和设计开发平台,有关Visor的设计架构和技术应用,在以后的文章里会逐渐跟 ...

  8. 以一个权限系统来告别WebForm —(一)项目整休架构设计与数据库设计

    在本节我想与大家与分享一下,我所将要做的权限系统的架构和数据库的表的设计.请各位大神们对我项目中设计的不足之处进行指导,让我得以更好的写完它,留给需要它的人. 我的项目架构如下图所示: 如上图所示,在 ...

  9. 物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了。

    物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了.   步骤如下: 一.反向生成物理数据模型PDM 开发环境 PowerDes ...

随机推荐

  1. 大学同学做Java开发比我多5K,八年老Android只会crud该转Java吗?

    最近在网上看到这样一个帖子: 做了八年Android开发,感觉这块做着也挺没意思,日常工作就是做一些架构优化,质量数据监控,改一改构建脚本,最主要的是业务负责人没有一个是做客户端的,都是后端的人. 最 ...

  2. 程序员被老板要求两个月做个APP,要不比京东差,网友:做一个快捷方式,直接链到京东

    隔行如隔山,这句话说得一点都没错.做一个程序员,很多人都会羡慕,也有很多人会望而却步. 作为一个外行人,你别看程序员每天坐在电脑前敲敲键盘打打代码,以为很简单,其实啊也只有程序员自己明白,任何一个看似 ...

  3. 最全总结 | 聊聊 Python 数据处理全家桶(PgSQL篇)

    1. 前言 大家好,我是安果! Python 数据处理全家桶,截止到现在,一共写过 6 篇文章,有兴趣的小伙伴可以去了解一下! 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇) 最全 ...

  4. 复杂字符串转List<JSONObject>

    public static List<JSONObject> getlist(String data){ ObjectMapper mapper = new ObjectMapper(); ...

  5. SpringBoot开发十一-显示登录信息

    需求介绍-显示登录信息 我们需要在每个页面的头部都要把登录用户的头像显示出来,另外在详细信息里面你需要显示用户的名字,除此之外如果登录了,我们显示首页 信息 头像 三个功能的链接,否则显示首页 登录两 ...

  6. HTML5(十二)——一文读懂 WebSocket 原理

    一.WebSocket 由来 WebSocket 是一个持久化的协议,通过第一次 HTTP Request 建立连接之后,再把通信协议升级成 websocket,保持连接状态,后续的数据交换不需要再重 ...

  7. 玩转 pyocd

    (一) pyocd (1) 什么是pyocd ​ pyocd 是 arm 开发的一个 python 包(python package),该软件包可以使用多种USB调试器对 arm cortex-M 微 ...

  8. ubuntu与主机ping不通的解决办法(主机检测不到虚拟网卡)

    文章目录 一.问题的出现与思路的转变 二.Ubuntu的网络适配器的俩种模式 1.桥接模式( Bridged) 2.NAT模式 三.桥接模式下的网卡配置出现问题 四.解决问题的步骤(一次通过) 集线器 ...

  9. ManagementEventWatcher throws ManagementException with call to Stop()

    参考网址:https://stackoverflow.com/questions/46100105/managementeventwatcher-throws-managementexception- ...

  10. C#高级应用之------HashTable、HashSet和Dictionary的区别(转)

    原文url:http://www.cnblogs.com/akwwl/p/3680376.html 今天又去面试了,结果依然很悲催,平时太过于关注表面上的东西,有些实质却不太清楚,遇到HashTabl ...