【问题标题】:NoSQL Documents for Relational Like Data (Locations)关系类数据的 NoSQL 文档(位置)
【发布时间】:2011-04-11 21:09:19
【问题描述】:

我有一个位置列表,当前在 MySQL 中它上面有一个层次结构,如大陆 > 国家 > 县/地区/州 > 普罗旺斯 > 位置。如果我要将这些位置存储在 NoSQL 存储(如 CouchDB)中。我是否将大陆存储为顶级对象,其余存储为该大陆的子对象数组。然后使用 map/reduce 为国家、县等创建各种视图。这是此类数据的推荐结构吗?它会让每个大陆的文件都很大吗?

{
  name: "Europe",
  type: "CONTINENT",
  countries: [
     { 
       name: "England" 
       counties: [...]
     }
  ]
}

【问题讨论】:

    标签: nosql couchdb


    【解决方案1】:

    这只是我的一个建议和推测,但我想我可能有一个好主意。 (我也强烈建议您查看 GeoCouch 以获取位置类型数据。)

    如果您想自己继续,您可以存储每个位置,并将所有详细级别存储为属性:

    {
        "continent": "North America",
        "country": "United States",
        "state": "Texas",
        "city": "Houston"
    }
    

    我来自美国,所以我使用的是我通常用来确定我的位置的信息。 (我注意到你使用了普罗旺斯、县等,可以很容易地融入到这个模型中)

    无论如何,视图函数应该是这样的:

    function (doc) {
        emit([doc.continent, doc.country, doc.state, doc.city], null);
    }
    

    此视图将输出:

    {
        "key": ["North America", "United States", "Texas", "Houston"],
        "value": null
    }
    

    现在,我知道这是冗余数据,因为它在每个位置都是这样存储的。没关系,我们正在处理 NoSQL,没有必要继续考虑关系。 (这就是为什么您正在寻找另一个解决方案,例如 CouchDB)

    无论如何,您都可以使用查看参数group_level 来“向下钻取”您的位置。使用group_level=1 将获得按大陆分组的查看结果。 group_level=2 将按国家/地区分组,group_level=3 将按州分组,等等。

    使用 reduce 函数可以获得每个分组的计数和其他统计信息。我希望这会有所帮助!

    【讨论】:

    • 非常感谢。另一个问题,如果我可以。如果每个区域都有关于该区域的数据怎么办?例如,对于英格兰,我们有一些关于冲浪区域的文本信息。理想情况下,如果我们更改文本,我们不会更新所有包含 England 的文档?
    • 您可以有一个单独的文档类型,只有大洲和国家/地区,然后您可以使用单独的视图来引入该文档类型。
    • 感谢您的帮助。您的解决方案创建了某种关系结构?这不是问题,而是您的建议?
    • 为了最终实现不必要的优化,您可以将null 替换为数字1,这样每行将节省5 个字节。 (null 编码需要 7 个字节,但小于 256 的整数只需要 2 个。
    • 数字1 也很好,因为您以后可以快速添加reduce: "count" 减少并轻松计算行数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2014-12-18
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多