关于模式设计的建议-MongoDB或潜在的Neo4J

关于模式设计的建议-MongoDB或潜在的Neo4J,mongodb,neo4j,database-schema,Mongodb,Neo4j,Database Schema,我正在为个人使用建立一个简单的会计程序(平均堆栈)。我接触Mongo是因为我熟悉它,但当我充实模式时,我有疑问。我想表达我的想法,并就可能的另一种方式征求建议 由于同一笔交易必须显示在任意数量账户的分类账上,我目前的想法是不将交易存储为账户的子文档,而是将其存储为自己的集合(以避免重复)。除去不重要的部分,它看起来是这样的: var accountSchema = new mongoose.Schema({ name: String, // etc }); var entryS

我正在为个人使用建立一个简单的会计程序(平均堆栈)。我接触Mongo是因为我熟悉它,但当我充实模式时,我有疑问。我想表达我的想法,并就可能的另一种方式征求建议

由于同一笔交易必须显示在任意数量账户的分类账上,我目前的想法是不将交易存储为账户的子文档,而是将其存储为自己的集合(以避免重复)。除去不重要的部分,它看起来是这样的:

var accountSchema = new mongoose.Schema({
    name: String,
    // etc
});

var entrySchema = new mongoose.Schema({
    amount: Number,
    account: {type: mongoose.Schema.Types.ObjectId, ref: 'Account'}
});

var transactionSchema = new mongoose.Schema({
    date: Date,
    debits: [entrySchema],
    credits: [entrySchema]
});
虽然在我看来,这似乎是存储数据的一种合乎逻辑的方式,但存在一些明显的查询问题。例如,当我想查看一个账户的分类账时,我必须迭代该期间的所有交易,并且对于每个交易,迭代信用和借记托收,以检查该账户是否涉及


我没有任何使用graph dbs的经验,但我认为像Neo4J这样的东西可能更适合查询这种类型的数据。我的问题是,你同意吗?或者Mongo仍然是一个不错的选择,但我认为模式是错误的?

是的,你是对的。在处理连接数据时,Neo4j是一个不错的选择

您当前的策略基本上是嵌入对来自其他模式的标识符的引用(一种外键)。在查询时,它将需要完全扫描一个类似连接的操作,随着数据库大小的增加,这将变得非常昂贵

此外,您还需要关注这些引用数据的更新和删除。否则,您将有不一致的数据

有了Neo4j这样的图形数据库,您的数据模型将是一个图形,我认为这对于您的场景来说更“自然”和直观。我不完全理解您的需求和场景,但我相信图形数据模型可以是:

这样,您就可以使用的功能来查询图形。例如,要从“2017-10-10”起从给定帐户获得所有信用,您可以执行以下操作:

MATCH(a:Account)<-[:ENTRY_TO]-(e:Entry)<-[:CREDIT]-(t:Transaction)
WHERE a.id = 10 AND t.date > "2017-10-10"
RETURN e

MATCH(a:账户)感谢您的详细回复;你证实了我的怀疑。这将是我学习新事物的良好起点,这永远是一个胜利。这张图片/信息的来源?您还可以使用两个节点注释进行建模:帐户和“付款”,与XRP分析相同