流星和MongoDB下降人口和完整性

时间:2014-06-30 19:50:03

标签: mongodb meteor

希望我能正确描述这个,但我来自RDBMS世界,我正在使用Meteor建立一个库存类型应用程序。 Meteor和Mongodb可能不是这个应用程序的最佳选择,但希望它可以完成,这似乎是许多转换器将遇到的情况。

我试图忘记关于关系数据库和参照完整性的许多事情,所以我可以把我的头脑包裹在Mongodb中,但是我已经挂了这个问题以及如何用Meteor正确地找到数据。

库存应用程序会有一些下降但我会用一个例子来更好地解释。假设我想跟踪一个项目,所以我想要名称,手头数量,制造商和位置。远不止于此,但我保持简单。

手头的名称和数量很容易,因为它们是由用户输入的,但制造商和位置应该从数据驱动列表的下拉列表中选择(我假设是一个类别集合(或一个新的集合)如果它是一个新的制造商或位置,则添加到列表中。可能性我将使用自动完成包,但重点是相同的。我当然不希望最终用户拼错制造商名称,从而最终文件应该有相同的制造商,但不是由于拼写错误。所以我需要一些方法来强制为制造商和位置存储的数据的完整性。

原因是当用户稍后查看所有库存物品时,他们可以选择过滤数据。他们可能希望按制造商过滤库存项目。或者按位置。或两者兼而有之。

以我的关系思维方式,这只是三张桌子。库存,制造商和位置。在INVENTORY表中,我将存储相关的相应表行的ID。

我正在试图弄清楚如何使用Mongodb存储这些数据,同样重要的是,如何找到这些制造商和位置项目以便首先填充下拉列表。

我发现以下文章可以帮助我理解一些事情,但不是我需要把头脑中的点连接起来。

谢谢!

referential data

[编辑]

当然,仍然在这方面工作,但我提出的最好的方法是按照上面的文章列出的方式进行标准化。像这样:

inventory
{
name: "Pen",
manufacturer: id: "25643"}, 
location: {id: "95789"} 
}

manufacturer
{
name: "BIC",
id: "25643"
}

location
{
name: "East Warehouse",
id: "95789"
}

似乎这样(以更简单的形式)对于许多/大多数应用程序来说都是非常普遍的需求,所以要确保我正确地接近它。即使这个示例代码是正确的,我应该使用带有生成数字的id字段,还是应该使用内置的_id字段?

1 个答案:

答案 0 :(得分:1)

我来自一个类似的背景,所以我不知道我是否在我的应用程序中正确地完成了它,但我已经找到了类似的选项。我的应用程序是一个电子学习应用程序,因此组织将有许多课程。

所以我的架构看起来与你的架构类似,不过我显然有一组看起来像{course_id: <id>}的对象

然后我注册了一个帮助者,而不是从组织中获取数据,并添加了我需要的关于课程的其他数据。

// Gets Organisation Courses - In your case could get the locations/manufacturers
UI.registerHelper('organisationCourses', function() {
    user = Meteor.user();
    if (user) {
        organisation = Organisations.findOne({_id: user.profile.organisation._id});
        courses = organisation.courses.courses;
    return courses;
    } else {
        return false;
    }
});

// This takes the coursedata and for each course_id value finds and adds all the course data to the object
UI.registerHelper('courseData', function() {
    var courseContent = this;
    var course = Courses.findOne({'_id': courseContent.course_id});
    return _.extend(courseContent, _.omit(course, '_id'));
});

然后,从我的页面,我只需要打电话:

{{#each organisationCourses}}
    {{#with courseData}}
        {{> admListCoursesItem}}
    {{/with}}
{{/each}}

如果我没记错的话,我会从EventedMind How-to video中选择这种方法。