V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
drroot
V2EX  ›  程序员

哪个数据库 SQL or NOSQL 处理距离最方便?

  •  
  •   drroot · 2017-01-08 04:50:30 +08:00 · 5520 次点击
    这是一个创建于 2882 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网站会有频繁的如下搜索请求: 离 <邮编 xxx> <1 公里> 内所有的 <餐馆>

    以上:

    1. <邮编 xxx>为任何源地址,可以是一个 ip, 邮编,城市名字
    2. <1 公里> 为距离,也可以是 1 英里, 2 英里, 3 英里, 25 英里, 50 英里等
    3. <餐馆> 为类别,也可以是酒店等
    35 条回复    2017-01-09 09:54:10 +08:00
    drroot
        1
    drroot  
    OP
       2017-01-08 04:51:55 +08:00
    mongoDB?
    Wangxf
        2
    Wangxf  
       2017-01-08 05:05:21 +08:00
    不知道为啥这么多人推荐 mongo ?仅仅因为是 js 近亲?要说成本的话大学基本是都学过数据库啊,我记得我们学的还是 mssql 。。转换成 mysql 应该也没那么麻烦吧。。
    ericls
        3
    ericls  
       2017-01-08 05:06:49 +08:00 via iPhone
    Postgres 做这个也很方便
    shiny
        4
    shiny  
       2017-01-08 05:58:13 +08:00 via iPhone
    距离是可以换算的,没那么麻烦吧
    beginor
        5
    beginor  
       2017-01-08 06:34:04 +08:00 via Android   ❤️ 1
    数据量大而且查询频繁的话,建议使用空间数据类型,前提是要有经纬度,建立空间索引,非常适合楼主这种空间查询。

    主流的关系数据库都支持空间索引, MongoDB 貌似只支持 GeoRSS , 不知道是否支持空间索引。
    Return2legacy
        6
    Return2legacy  
       2017-01-08 06:46:07 +08:00 via Android
    mysql 5.7 以上
    aijam
        7
    aijam  
       2017-01-08 08:28:41 +08:00
    ElasticSearch
    srlp
        8
    srlp  
       2017-01-08 08:31:51 +08:00
    能装在内存的话(既然你有频繁查询), http://cristian.regolo.cc/2015/07/07/introducing-the-geo-api-in-redis.html


    mongodb 不太适合。
    loading
        9
    loading  
       2017-01-08 09:14:55 +08:00 via Android
    数据库主要功能不是运算!
    zeayes
        10
    zeayes  
       2017-01-08 09:20:46 +08:00
    @srlp redis 功能有限,支持不了类别。 PG+GIS
    cstj0505
        11
    cstj0505  
       2017-01-08 09:22:14 +08:00 via iPhone
    绝对是 postgresql 啊,速度快,原生支持点的数据类型,还提供相应函数, postgis 支持地理位置的处理。专业的都用这个
    skydiver
        12
    skydiver  
       2017-01-08 09:43:55 +08:00 via iPad
    支持 gis 最好的就是 pg 了吧
    k9982874
        13
    k9982874  
       2017-01-08 10:25:10 +08:00 via iPad
    mongod 和 redis 都有 geo api
    mko0okmko0
        14
    mko0okmko0  
       2017-01-08 10:48:05 +08:00
    任意直线距离,大部分常规资料库都一样快阿.
    还以为是在问以道路为准的.

    如果是在一个路网内.依照交通和道路状况.计算出两点之间最短交通路径.这个才是比较需要考虑图论资料库或是有特殊要化的.
    cstj0505
        15
    cstj0505  
       2017-01-08 10:51:12 +08:00 via iPhone
    @mko0okmko0 你说的这些也不需要图数据库, postgresql+postgis 完全满足要求,还提供对应的函数和索引。
    liprais
        16
    liprais  
       2017-01-08 10:53:21 +08:00
    postgis +1
    jedyu
        17
    jedyu  
       2017-01-08 11:03:03 +08:00
    postgis 不二选择
    lights
        18
    lights  
       2017-01-08 11:23:55 +08:00
    我记得 mongoDB 自带地图查询功能吧
    特地找了一下官网的说明,你看一下就好了
    https://docs.mongodb.com/manual/core/2dsphere/
    blacklee
        19
    blacklee  
       2017-01-08 11:47:32 +08:00
    Postgres 。

    我刚刚把一个用了两年多, 5500W+数据量的系统,从 MySQL 导入到 Postgres 。
    Warder
        20
    Warder  
       2017-01-08 12:23:43 +08:00 via Android
    做 gis 相关数据的应该都知道 postgres
    xjp
        21
    xjp  
       2017-01-08 14:24:03 +08:00 via iPhone
    @Wangxf mysql 还不支持地理位置查询
    xjp
        22
    xjp  
       2017-01-08 14:25:16 +08:00 via iPhone
    mongodb 和 redis 都支持地理位置查询 之前项目我们用 mongodb 的
    fasling
        23
    fasling  
       2017-01-08 14:40:17 +08:00 via Android
    可以直接用 PostgreSQL ,如果仅仅是这么一个需求的话可以参考地图分图幅的办法给每个餐馆和邮编分配一个网格号码,根据网格就可以直接遍历。这在空间数据处理里很常见。
    BobbyLu
        24
    BobbyLu  
       2017-01-08 17:10:42 +08:00
    PostgreSQL 似乎对地理位置数据有特殊的优化
    hao123yinlong
        25
    hao123yinlong  
       2017-01-08 20:39:34 +08:00
    推荐 PostgreSQL ,千万用户,地理位置存储目前使用的 Mongo ,准备切 PG
    fivesmallq
        26
    fivesmallq  
       2017-01-08 20:45:32 +08:00 via iPhone
    推荐 ElasticSearch ,之前用 mongo 性能太差
    TangMonk
        27
    TangMonk  
       2017-01-08 20:46:59 +08:00 via Android
    redis 处理比 postgis 还方便
    Miy4mori
        28
    Miy4mori  
       2017-01-08 22:10:14 +08:00 via Android
    不建议用 mongo db ,因为丫的不支持 ACID ,推荐 PostGis
    neoblackcap
        29
    neoblackcap  
       2017-01-08 22:57:11 +08:00
    @shiny 应用层目前的换算成本高罢了,毕竟地球是一个球体,地表两点的距离不是直线
    billlee
        30
    billlee  
       2017-01-08 23:02:17 +08:00
    @Miy4mori 搜索业务要毛线 ACID
    shiny
        31
    shiny  
       2017-01-08 23:08:17 +08:00
    @neoblackcap 看精度要求,精度不高可以 GeoHash ,索引做的恰当还是挺快的。
    ETiV
        32
    ETiV  
       2017-01-09 00:07:08 +08:00
    调百度、高德的 API 不行么,自己整不明白还非得自己做。。。?
    Miy4mori
        33
    Miy4mori  
       2017-01-09 01:40:31 +08:00 via Android
    @billlee 不但没有 ACID ,性能也差,虽然是搜索业务,有两者都兼顾的为什么不用呢?
    Sharuru
        34
    Sharuru  
       2017-01-09 08:05:12 +08:00 via Android
    如果楼主是类似生活 POI 兴趣点搜索的话,调地图 API 最快最容易。

    如果涉及到自有 LBS , GIS 的话,还是推荐 PostgreSQL ,专业做这个。

    毕竟,谁都不知道未来需求,稍微“未雨绸缪”下也是值得考虑的。

    (不过,同样也得考虑学习成本,看回复不同数据库的选择和技术栈也有关系
    Nitromethane
        35
    Nitromethane  
       2017-01-09 09:54:10 +08:00
    这种场景更考验的是如何设置缓存
    推荐使用 redis 与传统结构性数据库配合
    否则高并发场景下,仅仅凭数据库性能是远远不够的,除非你单机性能特别强特别强特别强
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3379 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:43 · PVG 08:43 · LAX 16:43 · JFK 19:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.