这是存储分层数据的最佳方式。 例如:一名员工曾在多家公司工作。在每家公司,他都参与过多个项目。在每个项目中,他都使用不同的模块。员工曾就读于不同的大学。在每所大学,他都有不同的科目。等等
如果我必须使用关系数据库,我最终会创建像员工、公司、项目、模块、学院等表。
我希望如果我有像 employee
这样的根节点,我可以调用像 employee.save
这样的东西,它应该保存整个树,如果我检索根节点,它应该检索整个树结构。
我知道像Redis 和MongoDB 这样的nosql 有这个能力。最近我也听说了neo4j。所以我很困惑使用哪个。这些数据只是用户的个人资料信息(仅在请求时显示),因此必须缓存它以提高性能。它还可能需要存储数百万用户的个人资料信息。
在我的项目中,我计划使用 mysql 作为主数据库,使用 Redis 来缓存数据库搜索结果。但是由于必须缓存配置文件信息,所以我不愿意使用 Redis 存储它。 所以请让我知道哪种是最好的存储方式。我应该使用另一个数据库,如 Mongo 等,还是 New4j 或只使用 Redis ....甚至 mysql?
最佳答案
图形数据库和其他 NoSQL/关系数据库的不同之处在于它们获取信息的方式以及扩展方式。
由于查询格式的原因,NoSQL 通常在获取关系信息方面表现不佳。 Graph 可以解决这些问题,但对您的项目来说可能有点矫枉过正。
SQL 语法:
SELECT person, SUM([score][1]), AVG(score), MIN(score), MAX(score), COUNT(*)
FROM demo
WHERE score > 0 AND person IN('bob','jake')
GROUP BY person;
Mongo/NoSQL 格式:
db.demo.group({
"key": {
"person": true
},
"initial": {
"sumscore": 0,
"sumforaverageaveragescore": 0,
"countforaverageaveragescore": 0,
"countstar": 0
},
"reduce": function(obj, prev) {
prev.sumscore = prev.sumscore + obj.score - 0;
prev.sumforaverageaveragescore += obj.score;
prev.countforaverageaveragescore++;
prev.minimumvaluescore = isNaN(prev.minimumvaluescore) ? obj.score : Math.min(prev.minimumvaluescore, obj.score);
prev.maximumvaluescore = isNaN(prev.maximumvaluescore) ? obj.score : Math.max(prev.maximumvaluescore, obj.score);
if (true != null) if (true instanceof Array) prev.countstar += true.length;
else prev.countstar++;
},
"finalize": function(prev) {
prev.averagescore = prev.sumforaverageaveragescore / prev.countforaverageaveragescore;
delete prev.sumforaverageaveragescore;
delete prev.countforaverageaveragescore;
},
"cond": {
"score": {
"$gt": 0
},
"person": {
"$in": ["bob", "jake"]
}
}
});
来源:QueryMongo
我认为您应该选择关系数据库,或者最好选择 postgresql,因为使用 SQL 存储和获取信息会更好,也更少麻烦。
在我看来,横向扩展不是您现在需要考虑的问题,如果是,您始终可以选择内存中的分布式缓存。
关于mongodb - 哪个数据库最好保存分层数据(树),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31967716/