【问题标题】:How and where do you define your database structure in Meteor?您如何以及在哪里定义 Meteor 中的数据库结构?
【发布时间】:2013-12-09 12:31:21
【问题描述】:

我正在查看 Meteor 的文档,它提供了一些示例。我对两件事有点困惑:首先,您在哪里构建数据库(牢记安全性)?我是否将其全部保存在服务器/私人文件夹中以限制客户端访问?其次,我如何定义结构?比如他们展示的代码:

Rooms = new Meteor.Collection("rooms");
Messages = new Meteor.Collection("messages");
Parties = new Meteor.Collection("parties");

Rooms.insert({name: "Conference Room A"});
var myRooms = Rooms.find({}).fetch();
Messages.insert({text: "Hello world", room: myRooms[0]._id});
Parties.insert({name: "Super Bowl Party"});

我不明白集合的结构是如何定义的。他们是否只能定义一个集合并将任意数据放入其中?

【问题讨论】:

    标签: node.js mongodb meteor


    【解决方案1】:

    要回答您关于将new Meteor.Collection 语句放在何处的第一个问题,它们应该放在客户端和服务器均可访问的文件夹中的.js 文件中,例如/collections。 (有一些例外:任何从不同步到客户端的集合,例如服务器日志,都应该在 /server 的某个地方定义;任何local collections 都应该在客户端代码中定义。)

    关于结构的第二个问题:MongoDB 是一个文档数据库,根据定义,它没有结构。根据docs:

    数据库包含一组集合。一个集合包含一组 文件。文档是一组键值对。文件有 动态模式。动态模式意味着文档在同一 集合不需要具有相同的字段或结构集, 集合文档中的公共字段可能包含不同的类型 数据。

    您可能还听说过这称为 NoSQL。每个文档(SQL 用语中的记录)可以有不同的字段。因此,没有地方可以定义集合的初始结构。每个文档在插入或更新时都会定义其“结构”。

    在实践中,我喜欢在每个 new Meteor.Collection 语句上方创建一个块注释,解释我希望该集合中的大多数或所有文档的结构,所以我稍后插入或更新时可以参考集合的文件。但在这些插入或更新函数中,我要遵循我为自己定义的任何结构。

    【讨论】:

    • 嘿,你要快几分钟;)
    • :) 是的,但你涵盖了很多我没有涵盖的内容。
    【解决方案2】:

    一个好的做法可能是使用一点 javascript 代码在客户端和服务器上定义您的集合。换句话说,把下面的

    MyCollection = new Meteor.Collection("rooms");
    // ...
    

    任何地方,但既不在client 也不在server 目录中。请注意,仅此指令不会向任何人公开任何敏感数据。

    一个全新的流星项目默认包含insecure 和autopublish 包。前者基本上允许任何客户端以各种可能的方式更改您的数据库,即插入、更新和删除文档。后者将确保将所有数据库内容发布给所有人,无论这听起来多么荒谬。但不要害怕!他们唯一的目标是在早期阶段简化开发过程。一旦你开始考虑任何类型的安全问题,你就应该从你的项目中摆脱这些。

    一旦从您的项目中删除了insecure 包,您就可以通过定义MyCollection.allow 和MyCollection.deny 规则来控制数据库权限。请查看documentation 了解更多详情。在这里我唯一想说的是,这段代码可能应该被认为是敏感的,所以我想你应该把它放到你的server目录中。

    删除autopublish 包会影响将发送给您的客户的数据集。同样,您可以通过实现自定义Meteor.publish 例程来控制它并定义您选择的特权。这一切都记录在案here。在这里,你别无选择。代码只能在服务器环境下运行,所以最好的选择是放在server目录下。

    关于你的第二个问题。关于 NoSQL 数据库(如 mongodb)的全部讨论是尽可能减少对数据库结构的限制。换句话说,集合的结构方式完全取决于您。您不必定义任何模型,您可以随时更改文档的结构(和/或删除字段)。听起来不是很好吗? :)

    【讨论】:

    • 只是为了确认,您必须为您创建的每个集合定义自己的允许/拒绝规则,否则只有在您不使用不安全包时才授予所有访问权限?
    • insecure 包是关于改变数据库的。如果存在,allow/deny 规则将被简单地忽略。一旦您从项目中删除它,客户就不允许做任何事情。如果您想授予他们一些权限,您需要定义自定义 allow/deny 规则。
    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多