素材牛VIP会员
定位服务的数据表设计
 何***孽  分类:SQL代码  人气:713  回帖:2  发布于6年前 收藏

目前有大概300多个终端(智能手机)需要每20s向服务器发送一次坐标,携带信息包括电话号码和坐标以及类型等其他信息,后续也可能有新的终端加入到系统,这个加入是全自动的,也就是一个新的智能手机,装了一个app之后就开始上传,没有注册什么的步骤。

另外需要提供一个包含地图的页面让客户能够看到这些终端的最新位置并实时刷新,拟采用ajax轮训,每30秒查询一次服务器。

准备采用mysql,现在觉得数据库结构不确定,有几种思路:
1 一个表搞定数据

phone    type    x    y    updated

收到终端定位请求就插入一条记录,页面查询的话通过sql语句查出每个终端最新的位置

这样感觉比较简单,每次请求只需一次插入操作,但是如果后续终端包含的信息多起来的话,担心冗余,比如这个表里面 type就重复存储了。

2 两张表

表1:元数据

phone    type    x    y

表2:轨迹数据

phone    x    y    updated

这样收到终端定位,首先插入一条记录到表2,然后判断表1里面有没有这个phone,没有就代表新增设备,insert一条记录,有的话就更新坐标。
页面查询就查询表1。

这个方式会导致在收到终端坐标需要两次操作,可能需要事务控制。

不知道这些方式那个可行?有没有做过类似项目的给点经验?

另外,后台用node做靠不靠谱?

 标签:mysqlnode.js

讨论这个帖子(2)垃圾回帖将一律封号处理……

Lv6 码匠
好***下 职业无 6年前#1

貌似最大的问题不是设计结构而是数据库选择,建议直接一个mongodb搞定,不用两个数据库。
这样只要两个collections就可以搞定,mongo的更新和插入还支持批量插入。
建个2d的索引,将来如果做z坐标索也有一定扩展能力。
表1:元数据

phone  type "gps":{lat , long} updated

表2:轨迹数据

phone  "gps":{lat , long} updated

mongo的一些特性肯定让你未来的操作更简便
比如:
找某点最近的phone:

db.phone.find({"gps":{"$near":[x.y]}}).limit(1)
将来如果到1000个终端,每次都刷新一遍可能效率不高,可以根据时间戳做条件或者只显示某个点{x,y}直径R范围内的机器,而不用查所有的机器的话:
db.phone.find({"gps":{'$within':{'$center':[[x,y],R]}}})

Lv5 码农
sh***ao 职业无 6年前#2
  1. 方式2是对的。终端自身的数据是持久性的,终端位置是非持久的。这两类数据分开绝对是个好主意。
  2. 数据库用mysql估计300多个终端还能顶得住。但还是早做准备为好。终端多了迟早需要mysql+redis。
  3. 看不出有什么需要事务的地方。这个应用的策略绝对是牺牲整批数据完整,来给响应速度让路的。
  4. 高并发时保证表2的写入性能,表1的读取可以次要保证,而表1的写入就用异步的手段去拖延。当然这种时候就不光需要分表了,而是必须分库甚至分服务器。
  5. nodejs做后台没有致命的问题,值得一用。
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取