mongodb - 哪个数据库最好保存分层数据(树)

标签 mongodb neo4j redis database nosql

这是存储分层数据的最佳方式。 例如:一名员工曾在多家公司工作。在每家公司,他都参与过多个项目。在每个项目中,他都使用不同的模块。员工曾就读于不同的大学。在每所大学,他都有不同的科目。等等

如果我必须使用关系数据库,我最终会创建像员工、公司、项目、模块、学院等表。

我希望如果我有像 employee 这样的根节点,我可以调用像 employee.save 这样的东西,它应该保存整个树,如果我检索根节点,它应该检索整个树结构。

我知道像RedisMongoDB 这样的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/

相关文章:

redis - Redis 是管理票证状态更新用例的好选择吗

mysql - 在 rails 中向 mysql 插入 100000 多条记录的最快方法

mongodb - MongoDB-mongodb安装向导过早结束

mongodb - 同一台服务器上的多个 Mongodb 实例

node.js - Mongoose 中的 Joi.forbidden() 等效项

java - 我如何在 Neo4j 中创建这个索引?

mongodb - 聚合截断日期函数?

neo4j - 使用 NEO4j 显示具有多个关系的节点

java - 使用嵌入式 API 向节点添加标签

python - 无法使用 django-redis 连接到 redis