Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按属性搜索的最佳数据库类型和架构_Mysql_Mongodb_Search_Attributes_Database - Fatal编程技术网

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

Mysql 按属性搜索的最佳数据库类型和架构,mysql,mongodb,search,attributes,database,Mysql,Mongodb,Search,Attributes,Database,我知道这个问题可能没有一个简单的答案,或者至少有许多可能的正确答案 我正在开发一个天气网络应用程序,通过天气摘要、温度、湿度、降水、风速、能见度、气压和其他一些天气指标来搜索城市。我还将设置气象站,为了使事情更容易,让我们认为它是独一无二的,在每一个城市。我还想包括一些城市数据,如:人口、绿化指数以及纬度、经度 非洲大陆、国家和地区也将是需要的 气象站将包括安装在其中的每个传感器的型号 大约有5000个城市 最常用的查询将是按温度、湿度、降水量、风速、能见度和气压范围搜索城市,并按人口等和气象站

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

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

非洲大陆、国家和地区也将是需要的

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

大约有5000个城市

最常用的查询将是按温度、湿度、降水量、风速、能见度和气压范围搜索城市,并按人口等和气象站传感器型号名称进行过滤

查询如下所示:

  • summary=“清除”

  • 温度>6,温度<10

  • 气压>900,气压5,能见度<7

  • 湿度>0.60,湿度<0.90

  • 人口>20000

  • 造林指数>3

  • 国家=法国

  • 和“传感器1”=“字符串”

问题是:在性能方面,哪种数据库类型和模式最适合我的搜索需求?正如你所见,我需要按属性而不是城市名称本身进行搜索。我完全可以自由地使用关系数据库或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框架


非常感谢你的帮助

下面的模式可能就是您正在寻找的模式

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

这将是城市集合中的一行

{
    "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"
}

一张桌子里有5000行?大约20个指标?没有“历史”

创建一个包含5000行和20列的表。当气象站在中报告时,除用于更新行的最小主键外,没有其他索引。从所需的条件中构建一个SELECT,然后让优化器执行完整的表扫描

一切都将留在RAM中,选择将是“蛮力”。这应该只需要几毫秒。(我在一张2.7M行的桌子上运行了类似的SELECT;耗时1.3秒。)


如果您要保留历史记录,那么我们需要进一步讨论。

您看过Neo4j了吗?它是一个图形数据库,在属性环境中工作得更好。另一种可能性是将城市划分为单独的集合,并添加到区域集合的链接,从而使数据平坦化,或者反转数据,使区域数据成为一个嵌套的局部区域。请注意,mongo有一个很棒的异步驱动程序,名为motor,非常适合tornado。非常感谢Tony Stark的模式(我一直想这么说)!如果区域、国家和大陆包含的数据多于其名称,那么就搜索性能而言,可以创建三个额外的集合(区域、国家和大陆)并将它们链接到城市集合吗?这对搜索性能有好处吗?这是你在上面的评论中建议的吗?:)是的,你可以,这是我在评论中的最初建议,下面是:你需要从自己的集合中预先搜索Id字段,以在城市数据中找到它们的Id,因为在文档DB'sHi Rick中没有连接,你是指在关系数据库中吗?是的。我在考虑MySQL RDBMS。我(目前)没有使用任何“关系”的东西,只是将其用作存储和搜索机制。如果只有500*20个度量,那么您可以用编程语言将它们加载到数组中,而不使用任何类型的数据库。但是你必须模拟
和可见性>5,可见性<7和…