MongoDB和Meteor.js-一对多引用



我是Meteor和MongoDB以及数据库的新手,所以提前表示抱歉。

我正在构建一个小型的、基本的网络应用程序,它的功能就像博客。你有一个帖子,上面附有一些东西,比如标题、日期等。除了我想添加标签之外,我已经把这些都做好了。我听说在每个post对象中存储所有标签是个坏主意,应该使用关系。

到目前为止,我得到的就是这些。

galleryItems = new Mongo.Collection("galleryItems");
galleryTags = new Mongo.Collection("galleryTags");

Mongo中的两个集合。一个用于项目,一个用于标记。

我有一个插入这两个数据库的表单。

  galleryItems.insert({
    text: text,
    url: url,
    thumbnail: thumbnail,
    createdAt: new Date()
  });
  galleryTags.insert({
    tags: tags, // tags is just an array I have created before this
  });

我真的很纠结于如何将这两个系列联系在一起。

在MongoDB中,我有时会有意避免规范化我的数据。这是因为在基于文档的数据库中使用引用并不那么容易。流星并没有让它变得更容易。在MongoDB中这样做很常见——例如,嵌入的文档本质上是非规范化的。MongoDB官方主页上有关于数据模型的好信息。

我想你的标签只有一个名字,没有其他数据?在这种情况下,您希望更改标签的名称还是删除它们?因为只有这些情况下,在每个帖子中存储标签会带来问题。如果是这样的话,您很可能不需要将标签分离到不同的集合中。

但是,如果真的想要规范化您的数据,这就是您应该做的。您的galleryItems集合将有一个名为tags的字段,它将存储标记的_id。例如:

galleryItems: {
    text: text,
    url: url,
    thumbnail: thumbnail,
    createdAt: new Date(),
    tags: [1, 2, 3]
}

然后你会有一个galleryTags集合,在那里你可以存储关于标签的信息:

galleryTags: {
    _id: 1
    name: tagName
}

现在您已经在galleryItems中引用了标记,但galleryItems不存储任何关于标记本身的信息——要获得关于标记的数据,您必须单独执行一个查询。

最新更新