我有一个网站,我正在使用Mongo。到目前为止,一切进展顺利。我有几个字段是静态选项数据,例如动物品种的字段和动物注册商的另一个字段。
品种
Arabian
Quarter Horse
Saddlebred
登记
AQHA
American Arabians
可能有5到6个不同的集合,范围从5-15个元素。
将这些放入Mongo的最佳方式是什么?现在,我为每个组都有一个单独的集合。这是一个品种集合,一个注册商集合等。
这是最好的方法,还是使用“type”字段指定选项类型的单个静态数据集合更有意义?
或其他完全不同的东西?
答案 0 :(得分:3)
由于这些数据是静态的,因此最好将数据嵌入文档中。这样您就不必进行手动连接。
并将它存储在一个单独的集合中(一个或多个,无关紧要,选择更容易)以便于演示(渲染组合框等)
答案 1 :(得分:2)
我认为创建多个集合会影响集合大小吗? (关于MongoDB在磁盘上创建一个集合文件的大小是前一个文件大小的两倍[db.0 = 64MB,db.1 = 128MB等等)
这是我能想到的:
<强> 1。存储为单个集合
这里的好处是:
我正在研究一个类似的项目。我将类别和子类别都存储在一个集合中。这是一个JSON / BSON转储示例:
在我需要存储“选项”的所有数据中(我的情况下是电台类别)我只使用_id。
{
"status": {
"code": 200
},
"response": {
"categories": [
{
"cat": "Taxi",
"_id": "50b92b585cf34cbc0f000004",
"subcat": []
},
{
"cat": "Bus",
"_id": "50b92b585cf34cbc0f000005",
"subcat": [
{
"cat": "Bus Rapid Transit",
"_id": "50b92b585cf34cbc0f00000b"
},
{
"cat": "Express Bus Service",
"_id": "50b92b585cf34cbc0f00000a"
},
{
"cat": "Public Transport Bus",
"_id": "50b92b585cf34cbc0f000009"
},
{
"cat": "Tour Bus",
"_id": "50b92b585cf34cbc0f000008"
},
{
"cat": "Shuttle Bus",
"_id": "50b92b585cf34cbc0f000007"
},
{
"cat": "Intercity Bus",
"_id": "50b92b585cf34cbc0f000006"
}
]
},
{
"cat": "Rail",
"_id": "50b92b585cf34cbc0f00000c",
"subcat": [
{
"cat": "Intercity Train",
"_id": "50b92b585cf34cbc0f000012"
},
{
"cat": "Rapid Transit/Subway",
"_id": "50b92b585cf34cbc0f000011"
},
{
"cat": "High-speed Rail",
"_id": "50b92b585cf34cbc0f000010"
},
{
"cat": "Express Train Service",
"_id": "50b92b585cf34cbc0f00000f"
},
{
"cat": "Passenger Train",
"_id": "50b92b585cf34cbc0f00000e"
},
{
"cat": "Tram",
"_id": "50b92b585cf34cbc0f00000d"
}
]
}
]
}
}
我调用了我的API来获取该文档(app.ly/api/v1/stationcategories
)。我觉得这很容易编码。
在你的情况下你可以有类似的东西:
{
"option": "Breeds",
"_id": "xxx",
"suboption": [
{
"option": "Arabian",
"_id": "xxx"
},
{
"option": "Quarter House",
"_id": "xxx"
},
{
"option": "Saddlebred",
"_id": "xxx"
}
]
},
{
"option": "Registrars",
"_id": "xxx",
"suboption": [
{
"option": "AQHA",
"_id": "xxx"
},
{
"option": "American Arabians",
"_id": "xxx"
}
]
}
无论何时需要它们,都可以循环播放它们,或从您的收藏中提取特定选项。
<强> 2。存储为静态JSON文档
正如@Sergio所提到的,这是一种可行且更简单的方法。然后,您可以为单独的选项提供单独的文档,也可以将它们放在一个文档中。
require('../../../options.json')
类似于PHP。读者会注意到我对这种方法持消极态度,但它有效,但相当不灵活。 虽然我们不鼓励在MongoDB上不必要地使用连接,但ObjectId引用有时是有用且可扩展的。
一个例子是,如果您的网站在世界某个地区变得流行,并且说来自波兰的人开始占据您网站访问量的50%。如果您决定添加波兰语翻译。您需要返回所有文档,并将波兰语名称(如果存在)添加到您的选项中。如果使用方法1 ,就像在选项中添加波兰语名称一样简单,然后在运行时从选项集合中提取波兰语名称。
除了将每个选项存储为集合
之外,我只能想到2个选项更新:如果有人对这两种方法都有正面或负面的话,请你添加它们。我的偏见可能对某些人没有帮助,因为存储静态JSON文件有好处
答案 2 :(得分:2)
MongoDB是无模式的,也不支持JOIN。所以你必须退出RDBMS和规范化,因为这纯粹是一种不同类型的数据库。
在设计指南时,您可以应用的规则很少。当然,您可以选择在需要时将其保存在单独的集合中。
静态主/参考数据
您必须始终将它们嵌入到您需要的文档中。由于数据不会被更改,因此保留在同一个集合中并不是一个坏主意。如果数据太大,请将它们分组并将它们存储在单独的集合中,而不是为此主数据本身创建多个集合。
注意:将集合作为子文档嵌入时,请务必确保永远不会超过16MB的限制。这就是MongoDB中每个集合的限制(此时)。
动态母带/参考数据
尝试将它们保存在单独的集合中,因为主数据往往会经常更改。
永远记住,没有加入支持,因此请保持这种方式,以便您可以轻松访问它而无需多次查询数据库。
所以没有建议的最佳方式,它总是根据您的需要而改变,设计可以采用任何一种方式。