在开发工业系统的数据采集功能相关的系统时,由于数据都是定时上传的,如每20秒上传一次的时间序列数据,这些数据在经过处理和计算后,变成了与时间轴有关的历史数据(与股票数据相似,如下图的车辆行驶过程中的油量曲线、历史轨迹数据等)。当采集点多的时候,如上万个采集终端,再加上时间的累积,数据表会变得越来越大。数据库会越来越难以维护。

对历史数据操作的功能有历史数据的查询、统计图表曲线显示等等。而这些基于组合条件的历史查询功能和图表显示功能对数据库的压力可不小,如果听之任之,则海量的数据查询、统计计算会非常慢,用户体验很差。所以对于这种类型的表结构设计的时候,要制定好策略,避免以后再进行变动就麻烦了。

常规的策略就是分表。减少单一数据表的容量,通过增加合并查询和计算的逻辑的复杂度来换取减轻查询对数据库的压力。

1     表设计

1.1   设计思想

  • 减少冗余数据的存储
  • 数据写入时进行预运算
  • 通过降低记录量提高系统的响应能力
  • 降低磁盘的读操作

1.2   模型结构

GPS轨迹日志数据表保存原始的定位信息数据,索引表为日志数据表的索引信息内容,预处理模块完成新数据的预处理运算功能,保持索引表的信息与日志数据表的信息一致。

  预处理模块建议为数据库内部的存储过程,保证对数据表操作的效率性能,通讯服务器以访问存储过程的方式,完成数据保存的事务处理。

1.3   模型原理

1.3.1 数据量

  日志数据表最多保存四个月的定位信息数据,最高的记录为246亿条数据,数据量为2.3T(2012年9月-12月)。

  索引表为日志数据表的索引信息,保留三个月零一天的车辆定位信息,每车每天为一条记录,最高数据量为432万,每个车辆每天的摘要信息保存在二进制的字段里。

  摘要的数据内容包含定位时间、速度、里程、经度、纬度、角度状态信息,摘要在索引表里按规定的报文方式保存在索引表的二进制字段里,每个车辆一天产生的定位数据量为4320条,速度为0的定位信息所占比例为40%-60%左右,因此摘要里只记录有速度的定位数据,每车每天的实际摘要的数据量为2000左右。每个摘要信息量为30Bytes,因此每车每天产生的摘要为58K Bytes左右。

  注:从统计角度考虑,摘要信息里也许会包括速度为0的定位信息。

1.3.2 读取性能

  索引表根据业务操作的需要分为“最新定位索引表”、“三个月定位索引表”及“相关的统计索引表”。由于索引表里的记录量在百万级别内,可以实现毫秒级别的响应能力,所有的定位摘要数据保存在一个BLOB的二进制字段里,一次性快速读取出58K Bytes左右的数据,即可获得全天的车辆定位数据,避免数据库在磁盘上随机检索定位数据读而引起I/O性能瓶颈。

1.3.3 索引数据的写操作

  每车每天的索引信息的更新,通过预处理模块完成,如果索引表里已经存在该车该天的记录,则进行二进制字段的更新,否则自动添加新的记录。新的车辆定位摘要信息通过规定好的报文协议直接追加到二进制字段后面。

  每天通过后台作业的方式,定时删除索引表里最早一天的数据。一次删除的最大记录量为4.9万条(2012年12月31日)。

1.3.4 索引数据的读

  读取车辆在某时间段内的定位数据,会从索引表里获得到相应天数的记录数,通过对BLOB字段进行数据协议的处理,获得定位摘要的记录集。

  协议的解析工作可以由预处理模块解析,然后反转为表形式返回给web应用,也可以数据库直接交付给web应用服务器二进制数据,由web应用服务器完成数据的解析操作。

1.3.5 报表统计

  索引表里二进制数据摘要的状态可以支持8种不同的状态,每个定位数据可以同时具有8种不同的状态,比如超速、偏移路线等,可以直接通过索引表进行统计,快速实时的获取最新的报表数据。

技术支持 By 省厓 QQ:2252224326  2252224326​​​​​​​@qq.com 版权所有 http://blog.sina.com.cn/u/6029512413  

海量数据GPS定位数据库表设计的更多相关文章

  1. Innodb IO优化 — 数据库表设计 转

    数据库表设计这块学问比较多,我这里单从互联网角度出发同时结合Innodb的特性给出一些设计方法供大家参考.本文构建大概分两分部分:Innodb的特性及设计中如何利用这种特性. Innodb特性: In ...

  2. Oracle数据库表设计时的注意事项

    表是Oracle数据库中最基本的对象之一.万丈高楼从平地起,这个基础对象对于数据库来说,非常重要.因为其设计是否合理,直接跟数据库的性能相关.从Oracle数据库菜鸟到数据库专家这个过程中,在表设计与 ...

  3. springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目

    一个简单的用户登录系统 用户有账号密码,登录ip,登录时间 打开登录页面,输入用户名密码 登录日志,可以记录登陆的时间,登陆的ip 成功登陆了的话,就更新用户的最后登入时间和ip,同时记录一条登录记录 ...

  4. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  5. ERP开发分享 1 数据库表设计

    这是我的ERP设计经验分享系列,今天讲的是数据库的表设计(1),主要阐述: 1.单字段的主键:2.使用int32作为主键类型:3.使用版本字段处理乐观锁定:4.生效字段标明是否允许“被使用”:5.锁定 ...

  6. Acitiviti数据库表设计(学习笔记)

    ACT_ID_*:与权限,用户与用户组,以及用户与用户组关系相关的表 ACT_RU_*:代表了流程引擎运行时的库表,RU表示Runtime ACT_HI_*:HI表示History当流程完成了节点以后 ...

  7. 抽屉之Tornado实战(2)--数据库表设计

    经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的 用户表 #一张表对应一个类 class ...

  8. 测试用数据库表设计和SessionFactory

    本篇为struts-2.5.2和spring-3.2.0以及hibernate-4.2.21的整合开篇. 一.测试的数据库表. 用户.角色和权限关系表.数据库是Mysql5.6.为了考虑到一些特殊数据 ...

  9. Tornado之抽屉实战(2)--数据库表设计

    经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的 用户表 ? 1 2 3 4 5 6 7 ...

随机推荐

  1. CF213E Two Permutations 线段树维护哈希值

    当初竟然看成子串了$qwq$,不过老师的$ppt$也错了$qwq$ 由于子序列一定是的排列,所以考虑插入$1$到$m$到$n-m+1$到$n$; 如何判断呢?可以用哈希$qwq$: 我们用线段树维护哈 ...

  2. object.wait为什么要和synchronized一块使用

    Object.wait 中JDK提供的doc文档 Causes the current thread to wait until another thread invokes the notify() ...

  3. (转)CentOS 7常见的基础命令和配置

    CentOS 7常见的基础命令和配置 原文:http://blog.51cto.com/hujiangtao/1973566 管理服务 命令格式:systemctl COMMAND name.serv ...

  4. CAST 变类型,如 SELECT CAST('12' AS int)

    select distinct CAST(value as signed) valueprice,CAST(value as signed) valueid from app_coupon

  5. JSONP 回调给全局变量赋值失败解决

    ;//回调结束标志位var 临时全局变量;var 需要接收的全局变量: function getDate(){ flag = 0; //回调 inviteService.getActivityDeta ...

  6. webpack webpack-dev-server报错

    Error: getaddrinfo ENOTFOUND localhost at errnoException (dns.js:28:10) at GetAddrInfoReqWrap.onlook ...

  7. C#语言使用习惯

    1.使用属性而不是可访问的数据成员 2.用运行时常量(readonly)而不是编译期常量(const) 编译期常量与运行时常量行为的不同之处在于对他们的访问方式不同,编译期常量的值是在目标代码中进行替 ...

  8. Oracle单行函数。。。

    单行函数 --字符函数--1.ASCII 返回与指定的字符对应的十进制数;select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') spa ...

  9. Java虚拟机,类文件结构深度解析

    Java类文件结构 Java虚拟机不和包括Java在内的任何语言绑定,只与 "Class文件" 这种特定的二进制文件所关联, Class文件中包含了Java虚拟机指令集合符号表以及 ...

  10. 提高jquery加载速率(有cdn就加载,没有就加载本地)

    <!-- Adds google cdn reference --> <script src="https://cdn.bootcss.com/jquery/3.2.1/j ...