按属性搜索的最佳数据库类型和架构

时间:2015-03-25 19:05:50

标签: mysql mongodb search attributes database

我知道这个问题可能没有简单的答案,或者至少有许多可能的答案。

我正在开发一个天气网络应用程序,通过汇总,温度,湿度,降水,风速,能见度,压力和其他一些天气指标来搜索城市。我还将包括气象站设置,为了使事情变得更容易,让我们认为它在每个城市都是独一无二的。我还想提供一些城市数据,如:人口,造林指数以及纬度,经度。

还需要大陆,国家和地区。

气象站将包括安装在其中的每个传感器的型号。

将有大约5000个城市。

最常用的查询将是通过温度,湿度,降水,风速,能见度和压力范围以及按人口等过滤和气象站传感器型号名称来搜索城市。

查询看起来像:

  • summary =“清除”

  • 和温度> 6和温度< 10

  • 和压力&gt; 900和压力<1000

  • 和知名度&gt; 5和可见性&lt; 7

  • 和湿度&gt; 0.60,湿度< 0.90

  • 并且人口是&gt; 20.000

  • 和植树造林指数> 3

  • 和country = France

  • 和“sensor1”=“string”

问题是:哪种数据库类型和架构最符合我的搜索需求?如您所见,我需要按属性而不是城市名称进行搜索。我完全可以自由使用Relational或NoSQL数据库而不是我想使用异步系统。

我不知道像MongoDB这样的NoSQL数据库是否打算像这样使用,如果是这种情况,这个模式是否足够快?我担心一切都是嵌套的,索引可能很大。

"continents": 
[
    {
        "name": "Europe",
        "countries": 
        [
            {
                "name": "France",
                "regions": 
                [
                    {
                        "name": "Île-de-France"
                        "cities": 
                        [
                            {
                                "name": "Paris",
                                "coordinates": {"lat": 48.856614, "lon": 2.352222},
                                "summary":"Clear",
                                "temperature": 9.4,
                                "pressure": 976,
                                "visibility" : 6.8,
                                "humidity" : 0.84,
                                "afforestation": 6,
                                "population": 2249975,
                                ...
                                "weather_station": {
                                    "name": "name",
                                    "sensor 1": "string",
                                    "sensor 2": "string",
                                    "sensor 3": "string",
                                    "sensor 4": "string",
                                }
                            },
                            ...
                        ]
                    },
                    ...
                ]                   
            },
            ...
        ]
    },
    ...
]

我想这个用例已在很多其他需要按元素属性搜索的应用程序中开发。

哦!我忘了说我使用的是Python和Tornado Web框架。

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

以下架构可能就是您要找的。

请注意,在文档DB中,您需要稍微对数据进行非规范化,以匹配其最常访问的方式

这将是City Collection中的一行

{
    "City": "Paris",
    "coordinates": {"lat": 48.856614, "lon": 2.352222},
    "summary":"Clear",
    "temperature": 9.4,
    "pressure": 976,
    "visibility" : 6.8,
    "humidity" : 0.84,
    "afforestation": 6,
    "population": 2249975,
    ...
    "weather_station": {
        "name": "name",
        "sensor 1": "string",
        "sensor 2": "string",
        "sensor 3": "string",
        "sensor 4": "string",
    }
    "region": "Île-de-France",
    "country":"France",
    "continent":"Europe"
}

答案 1 :(得分:0)

一张表中有

5000行?大约20个指标?没有&#34;历史&#34;?

制作一个包含5000行和20列的单个表。当气象站报告时,除了用于更新行的最小PRIMARY KEY之外没有索引。从所需条件构建SELECT,然后让优化器执行全表扫描。

所有东西都将保留在RAM中,而SELECT将是&#34;暴力&#34;。它应该只需几毫秒。 (我在2.7M行表上运行了类似的SELECT;花了1.3秒。)

如果你保持历史,那么我们需要进一步讨论。