我想这就是我要找的词。我在试着把父母的信息放进每张卡片里。我想这就是我需要做的,但是如果你有其他的想法的话,请加入进来。
{
"LEA": {
"name": "Limited Edition Alpha",
"code": "LEA",
"releaseDate": "1993-08-05",
"border": "black",
"type": "core",
"cards": [
{"name": "Air Elemental"},
{"name": "Earth Elemental"},
{"name": "Fire Elemental"},
{"name": "Water Elemental"}
]
},
"LEB": {
"name": "Limited Edition Beta",
"code": "LEB",
"releaseDate": "1993-10-01",
"border": "black",
"type": "core",
"cards": [
{"name": "Armageddon"},
{"name": "Fireball"},
{"name": "Swords to Plowshares"},
{"name": "Wrath of God"}
]
}
}
很明显,这是数据的一小部分。LEA
和LEB
是一组卡片,每一组里面都有一堆卡片。我正在考虑去或不正确地把这个变成仅仅的卡片,每一张卡都添加了设定信息。就像这样..。
{
{
"name": "Air Elemental",
"set": {
"name": "Limited Edition Alpha",
"code": "LEA",
"releaseDate": "1993-08-05",
"border": "black",
"type": "core"
}
},
{
"name": "Earth Elemental",
"set": {
"name": "Limited Edition Alpha",
"code": "LEA",
"releaseDate": "1993-08-05",
"border": "black",
"type": "core"
}
},
{
"name": "Armageddon",
"set": {
"name": "Limited Edition Beta",
"code": "LEB",
"releaseDate": "1993-10-01",
"border": "black",
"type": "core"
}
},
{
"name": "Fireball",
"set": {
"name": "Limited Edition Beta",
"code": "LEB",
"releaseDate": "1993-10-01",
"border": "black",
"type": "core"
}
}
}
首先,我的想法正确吗?我会想要一个庞大的cards
集合,并将设置信息平放到每一张卡中吗?在SQL中,我会为这些集合做一个表,并且卡片将belong_to
一个集合。我正试着把头脑集中在“文档思考”上。
第二,如果我的想法是正确的,我有什么想法可以实现这种脱脂吗?
发布于 2014-01-23 19:14:07
给你。
好的,这就是我要开始的地方。因为我们已经说过卡片永远不会改变(因为它们基于物理MTG卡),创建一个包含所有卡片的集合,这将用于稍后轻松地填充用户的牌。您可以通过卡名或某种类型的卡ID (如存储在卡上的物理ID)对其进行搜索。
对于用户的卡片对象数组,不应该只存储卡的_id
字段,因为这迫使您加入。由于卡片永远不会改变,因此完全去角色化,然后将它们推入卡片数组中,因此用户对象,到目前为止,类似于:
{
name: "Tom Hanks",
skill_level: 0,
decks: [
[
{
card_name: "Balance",
card_description: "LONG_BLOCK_OF_DESCRIP_TEXT",
card_creator: "Sugargirl14",
type: "Normal",
_id: $SOME_MONGO_ID_HERE,
... rest of card data...
}, {
...card 2 complete data...
}
],
[
{ ...another deck here... }
]
]
}
好的,回到set信息,我也将假设set信息是一个常量(基于你的SO帖子,我看不出它会如何变化)。因此,如果设置的信息总是与卡片相关,我将对其进行去或删除并将其包括在内,将我们的card对象更改为:
{
card_name: "Balance",
card_description: "LONG_BLOCK_OF_DESCRIP_TEXT",
card_creator: "Sugargirl14",
type: "Normal",
_id: $SOME_MONGO_ID_HERE
set: {
"name": "Limited Edition Alpha",
"code": "LEA",
"releaseDate": "1993-08-05",
"border": "black",
"type": "core",
"_id": $SOME_MONGO_ID_HERE
},
... rest of card data...
}
我认为,将其他卡片存储在非规范化对象中对于给定的卡片是不相关的,如果是的话,就添加它们。如果您注意到,您的SO示例中给出的键将被删除,因为它似乎总是== "code“字段。
好的,现在正确地回答你关于你是否应该在卡片中嵌入集合的问题,反之亦然。首先,这两个集合都是相关的。因此,即使我们将集合嵌入到卡片中,您也希望这些集合在集合中,以便以后可以获取它们并插入到新卡中。
它嵌入了哪些是真正由业务逻辑决定的,数据是如何使用的,以及哪些数据被更频繁地提取。你是否经常显示套装和从它们中提取卡片(比如用户搜索)?您可以将所有卡片数据或任何相关数据嵌入到每组的cards
数组中。但是使用上面的数据模型,每一张卡都将其集合ID存储在它的set对象中。我假设卡片只属于一组,所以要获得一个集合的所有卡片,您可以在您想要的集合的set.id == the Mongo ID
上查询您的卡集合。现在,由于业务逻辑的原因,集合需要最少的更新(希望没有更新),而且查询仍然很快(并且获得完整的卡片对象)。老实说,我会做后一件事,让我的牌保持干净。因此,卡片拥有它所属的集合,而不是拥有卡的集合。这是一种更多的SQLy方式,可以认为在Mongo实际上可以很好地工作(您永远不会加入)。
因此,我们的最终数据模型类似于:
集合1,一套:
//data model
{
"name": "Limited Edition Alpha",
"code": "LEA",
"releaseDate": "1993-08-05",
"border": "black",
"type": "core",
"_id": $SOME_MONGO_ID_HERE
}
收藏2,卡片:
//data model
{
_id: $SOME_MONGO_ID_HERE
card_name: "Balance",
card_description: "LONG_BLOCK_OF_DESCRIP_TEXT",
card_creator: "Sugargirl14",
type: "Normal",
set: {
"name": "Limited Edition Alpha",
"code": "LEA",
"releaseDate": "1993-08-05",
"border": "black",
"type": "core",
"_id": $SOME_MONGO_ID_HERE
... rest of card data...
},
}
集合3,用户:
{
_id: $SOME_MONGO_ID_HERE,
name: "Tom Hanks",
skill_level: 0,
decks: [
[
{
card_name: "Balance",
card_description: "LONG_BLOCK_OF_DESCRIP_TEXT",
card_creator: "Sugargirl14",
type: "Normal",
_id: $SOME_MONGO_ID_HERE,
set: {
"name": "Limited Edition Alpha",
"code": "LEA",
"releaseDate": "1993-08-05",
"border": "black",
"type": "core",
"_id": $SOME_MONGO_ID_HERE
},
}, {
...card 2 complete data...
}
],
[
{ ...another deck here... }
]
]
}
显然,这是假定每一张卡的集合数据与用户相关。现在您的数据是非规范化的,集合和卡片很少需要更新(根据业务逻辑),因此您将永远不需要级联更新或删除。操纵用户很容易。当您从用户甲板中删除一张卡时,您可以在相关的甲板数组上执行来自Mongo的$pull
(我认为这就是它的名称),其中包含的项的_id
字段==,您要删除的卡的蒙古ID。所有其他更新都更容易。
回想起来,您可能希望用户的甲板如下所示:
decks: {
"SOME_ID_HERE": [
{ ...card 1... },
{ ...card 2... }
]
}
这使得识别甲板变得更加容易,并将使您的拉(您将有更多的数据在前端和拉查询将更加精确)。它可以是一个数字,随机字符串,任何真正的,因为它被传递回前端。或者只使用他们的蒙戈身份证,当看甲板的时候,用户会有它的蒙戈ID。然后当他们从里面取出一张卡,或者加上一张卡,你就有了一个直接的标识符,可以很容易地抓取所需的甲板。
显然,所有文本(如:$MONGO_ID_HERE )的值都应该是MongoId()对象。
哇,那是紧张的,6800个字符。希望这对您是有意义的,如果任何词句令人困惑,或者如果我的JSON对象的格式被搞砸了,我很抱歉(请告诉我,如果有任何散文让我感到困惑,我会重述)。这有道理/解决了你的问题吗?
https://stackoverflow.com/questions/21129067
复制