哪种存储该特定数据的方法会更有效?

时间:2019-01-08 20:10:25

标签: arangodb arangojs

我有一个游戏的现有数据库-当前正在使用MySQL存储信息-我希望测试ArangoDB以比较速度。

我想知道将所有玩家信息存储在一个集合中会更好还是将两者分开将更有效(甚至只是更好的做法)。

在MySQL中,我实际上没有选择,但是使用ArangoDB可以。

例如,在MySQL中存储清单信息:

    +---------------------------+
    | user_id | item_id | count |
    +---------+---------+-------+
    |       1 |       1 |     7 |
    |       1 |       2 |     4 |
    +---------+---------+-------+

或者在ArangoDB中,我可以执行以下操作之一:

  1. 包含所有信息的单个集合:

    {
        _key: "Unique User ID",
        health: 100,
        money: 52.38,
        // .... ,
        inventory:
            {
                item1: 7,
                item2: 4
                // , ....
            }
    }
    
  2. 将以上集合分为两个不同的集合(一个用于健康,金钱等,另一个用于库存数据):

    // 'user' collection
    {
        _key: "Unique User ID",
        health: 100,
        money: 52.38,
        ....
    }
    
    // 'inventory' collection
    {
        _key: "Unique User ID",
        item1: 7,
        item2: 4
        // , ....
    }
    

以上两种方法中的哪一种(或者甚至我没有想到的另一种)会更有效?

1 个答案:

答案 0 :(得分:1)

嗯,答案取决于您期望应用程序使用的数据的方式。这里有一些关于如何选择如何存储数据的提示:

  • 库存数据是否很少更改,并且在访问用户信息时通常需要吗?如果是这样,那么您最好使用选项1(将库存数据和用户信息一起存储)。

  • 是否要使从关系存储到文档存储的过渡尽可能轻松?然后,您可以将选项2与单独的集合一起使用。 Arangodb支持整个集合中的联接,并且效果很好。

  • 现在,如果您不介意学习曲线,我建议您选择方案3:图形遍历。在这种情况下,您将以类似于以下的方式存储数据:

    //用户顶点集合

    {     _key:“ 1”,     生命值:100,     金钱:52.38,     .... }

    //项目顶点集合

    {     itemID:1     //,.... }

    {     itemID:2     //,.... }

    //库存边缘收集

    {      _from:用户\ 1      _至:item \ 1,     数:7 }

    {      _from:用户\ 1      _至:item \ 2,     数:4 }

由于ArangoDB对图形遍历具有本机支持,因此上述设置已针对真正快速的查询进行了优化。从关系数据库开始转移到图形数据库时的经验法则是,主表成为集合,而中间(联接)表成为边缘集合。 (显然还有更多,但这是一个好的开始)

如果我从头开始,我可能会先选择选项3。但是,正如我在开始时提到的,这取决于您打算如何使用数据。