我想创建一个会计系统。我正在学习流星。但我已经看到Meteor不支持关系数据库所以我不知道如何建立一个数据结构,用户可以在其中创建预算,创建多个会计数字“内部”/与此预算相关,以及多个预算行这些会计数字。
通常情况下,我将使用外键,表'A'
表示id字段,表budget
表示id字段,外键引用accounting_numbers
,表{ {1}}使用引用budget
的外键。
但如果我不能引用MongoDB中的其他表,我有点困惑如何创建简单的Web应用程序,如会计/预算系统。我想知道最好的选择是在budget_line
中的每个对象中保存预算ID和预算名称,但是如果用户想要更改预算名称该怎么办。他/她是否必须在accounting_numbers
中的所有对象中编辑名称?如果对象accounting_numbers
属于accounting_numbers
中的对象,该对象进一步属于budget_line
中的对象,那么我需要在accounting_numbers
中的每个对象中存储多少数据?
答案 0 :(得分:1)
你仍然可以创建多个"表"在Mongo aka集合中,并模拟关系结构。就结构而言,Mongo可以在struture中非常密切地映射到关系数据库。唯一的问题(也是一个巨大的问题)是Mongo不支持跨这些"表"的连接,因此您需要在代码中手动执行这些连接或让ORM执行此操作为了你。 Mongo在" tables"之间也没有交易,所以这又是你需要手动或通过库精心实施的东西。
话虽这么说,在构建任何东西时,最好使用正确的工具来完成工作,而Meteor可能不是你想要的类似工具。 Mongo非常适合处理非关系数据的应用程序。会计数据几乎总是关系型的。我知道Mongo是" webscale"所有,但为了上帝的爱,请使用关系数据库。
答案 1 :(得分:0)
你还可以看看“太空大象 - 流星的PostgresSQL实现”。您可以使用PostrgreSQL作为数据库,而不会失去Meteor提供的主要优势,而不是使用MongoDB。主要是“反应性”和“延迟补偿”。
您还可以使用一些软件包来模拟关系数据库的功能。一个例子可能是“Meteor Collection Hooks”。这个包让你在“Mongo.Collection”调用之前和之后添加功能。所以,例如你可以像这样使用它:
Budget.after.update(function(userId, doc, fieldNames, modifiers, options){
if (this.previous.budgetName !== doc.budgetName){
AccountingName.update({budgetId: doc._id}, {$set: { budgetName: doc.budgetName }}, { multi: true });
}
});
我也同意Jamgreen的回答,但是如果你真的想要使用Meteor,我相信使用这个软件包并更多地了解MongoDB,你可以轻松实现你的应用程序。
希望这有帮助。