根据经纬度实现附近查找

网上找到的几种办法:

  1. 范围查找: blog.charlee.li/location-search/
  2. geohash算法: www.cnblogs.com/dengxinglin/archive/2012/12/14/2817761.html
  3. Mongodb的Geospatial indexes: docs.mongodb.org/manual/applications/geospatial-indexes/
  4. mysql扩展: github.com/lucasepe/lib_mysqludf_haversine

mongodb的Geospatial indexes应该是最强大的,提供了丰富的查询方法。缺点是增加了运维成本,对于不是专门做LBS的应用来说,也是一个问题。

第1,4种方法原理是一样的, 用到了haversine 公式:

  • 第1种算出来的是经纬度范围,然后再以该范围为条件查询数据库,把公式计算放在了应用层。
  • 第4种得出的两点的距离计算结果,可以用该结果来作为返回字段、过滤条件和排序, 但是数据量大的时候无法使用索引也是一个问题。
  • 这里还有haversine 公式各种语言的实现: www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe

私信系统的设计

需求:

  • 最基本的写、看、删
  • 删除效果只限于操作者本人,即本人删除私信对方仍可以看到私信记录
  • 会话合并显示,将与同一个人的私信记录合并成一条记录显示

 

数据结构:

mail-db图1.私信数据结构

三个表分别是: 会话表(mail_session)、私信-会话关系表(mail_map)、私信表(mail)

 

 说明:

mail-session图2.效果图

  1. 会话: 用户与用户的关系。
  • 当A发送一条私信给B时会产生两条会话记录:

A=>B (from_uid=A, to_uid=B)

B=>A (from_uid=B, to_uid=A)

  • 用户查看自己的私信列表时,只需查询 会话表mail_session(from_uid=:uid)即可
  • 用户删除自己的会话时,不会影响到对方
  • 删除会话时应该把 会话-私信表 mail_map 的关系也删除,避免冗余数据
  1. 信息:用户产生的文字
  • 当A发送一条私信给B时会产生两条会话-私信关系记录,分别与用户A、B自己的会话关联
  • 用户查看某个会话时,查询 mail_map LEFT JOIN mail (sess_id=:sess_id)
  • 用户删除某条私信时,在会话-私信表 mail_map 上删除相应记录 (map_id=:map_id) 或者(sess_id=:sess_id AND mail_id=:mail_id)即可
  • 发送私信时将最新私信内容更新到会话表的 last_message 字段中,适当的数据冗余简化私信会话列表的查询,可利用程序或触发器实现