用于关系型数据(位置)的NoSQL文档

用于关系型数据(位置)的NoSQL文档,nosql,couchdb,Nosql,Couchdb,我有一个位置列表,目前在MySQL中它上面有一个层次结构,比如大陆>国家>县/地区/州>普罗旺斯>位置。如果我将这些位置存储在NoSQL存储中(比如CouchDB)。我是否只将大陆存储为顶级对象,其余存储为该大陆的子对象数组。然后使用map/reduce为国家、县等创建各种视图。这是此类数据的推荐结构吗?这会让每个大陆的文件都变得非常大吗 { name: "Europe", type: "CONTINENT", countries: [ { name: "E

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

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

这只是我的一个建议和猜测,但我想我可能有一个好主意。(我还强烈建议查看位置类型数据。)

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

{
    "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\u level
来“深入”到您的位置。使用
group_level=1
将获得按大陆分组的视图结果<代码>分组级别=2将按国家分组,
分组级别=3
将按州分组,等等


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

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

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

{
    "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\u level
来“深入”到您的位置。使用
group_level=1
将获得按大陆分组的视图结果<代码>分组级别=2将按国家分组,
分组级别=3
将按州分组,等等


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

很好,谢谢。如果可以的话,还有一个问题。如果每个区域都有关于该区域的数据呢。例如,对于英格兰,我们有一些关于冲浪区域的文本信息。理想情况下,如果我们更改文本,我们不会更新其中包含英格兰的所有文档?您可以有一个单独的文档类型,只有大陆和国家,然后您可以使用单独的视图引入该文档类型。感谢您的帮助。您的解决方案创建了某种关系结构?这不是问题,但这正是您的建议?为了实现不必要的优化,您可以将
null
替换为编号
1
,这样每行可以节省5个字节。(
null
编码需要7个字节,但小于256的整数只需要2个。数字
1
也很好,因为您可以稍后快速添加
减少:“计数”
减少并获得简单的行数。谢谢。如果可以的话,还有一个问题。如果每个地区都有关于该地区的数据,比如说英格兰,我们有一些关于该地区的文字信息用于冲浪。理想情况下,如果我们更改文字,我们不会更新其中包含英格兰的所有文档。您可以有一个单独的文档只有大陆和国家的文档类型,那么您可以使用单独的视图来引入该文档类型。感谢您的帮助。您的解决方案创建了某种关系结构?这不是问题,但这正是您的建议?为了最终实现不必要的优化,您可以使用编号替换
null
r
1
每行将节省5个字节。(
null
需要7个字节进行编码,但小于256的整数只需要2个。数字
1
也很好,因为您可以稍后快速添加
减少:“计数”
减少,并轻松进行行计数。