在MEAN堆栈应用程序中组织数据模型的正确方法

时间:2016-07-13 12:48:43

标签: angularjs node.js mongodb mongoose

我正在制作一个MEAN堆栈应用程序并将Mongoose与Mongo一起使用。我正在努力在数据库中组织我的对象。一切都按预期工作,但我觉得我做事的方式是错的,但似乎找不到任何可以帮助我的主题资源,因此我希望有经验的人可以与我分享。< / p>

我使用Mongoose创建了几个模式,并且我遇到了一个与MongoDB中的嵌套对象有关的困境。 假设我有一个看起来像这样的模型:

ParentSchema:{
    property1:String,
    children:[{}]
}

因此,property1只是一些字符串,'children'是一个数组,它将包含具有一些其他属性的'Child'类型的对象,还有另一个数组(f.ex。'grandchildren:[{]}),这个时间与另一种类型的对象(孙子)。

Child和Grand没有架构,并且不存在于Parent之外,并且很可能对于Parent的每个实例都是唯一的,因此两个Parent不会共享Child对象。

在我的应用中,我可以使用'/ parent /:id1 / Child /:id2 / Grandchild /:id3'等网址,其中'id1'是Parent的实际ID Mongo生成,而'id2'是存储在Parents数组中的Child对象实例的索引。存储在Child对象中的孙子实例也是如此。

我在考虑可能为所有3个对象设置单独的模式,只是保存对象的引用是可行的方法,如下所示:

ParentSchema:{
    prop1:String,
    children:[{type:ObjectId, ref:'Child'}]
}
ChildSchema:{
    prop1:String,
    granchildren:[{type : ObjectId, ref: 'Grandchild'}]
 }
GrandChildSchema:{
    prop1:String,
    prop2:String
}

..但不确定,对我而言,这意味着Child和GrandChild实例将在不同的父母之间共享,但似乎更容易使用。

总结一下,我想知道的是:

  • 我应该选择哪种方法以及为什么:第一,第二或者其他一些我还不知道的方法。
  • 如果我选择第二种方法,我应该为每个对象创建单独的API路由吗?
  • 我如何创作呢?我希望这个过程看起来像这样:

    Start creating Parent -> start creating first Child -> create some Grandchildren -> 
    finish creating Child -> start creating second Child -> ... -> finish creating Parent. 
    

如果问题有点奇怪,我道歉,如果需要,我会尽力澄清。

1 个答案:

答案 0 :(得分:1)

我会采用第二种方法,原因有两个:

  1. 我认为架构具有更好的可读性。
  2. 它们允许您在第一种方法中缺少数据验证。
  3. 请注意,以下答案主要基于意见。

    对于API设计:

    我认为,由于您已经声明ChildGrandchild没有父母的权利,我认为由您明确向消费者公开的路径取决于您 - 我认为你的路线很好。

    最后 - 您创建这些实体的过程对我来说很好。我自己会做同样的事情。