arangodb:属性值历史

时间:2015-08-04 06:56:09

标签: data-modeling arangodb revision-history

对于我们数据库中的某些节点,我们需要存储每个更改字段值的历史记录。

我们正在考虑两种可能的结构:

  1. 使用键值索引,表单为

    id.attribute_name.counter = {
        "field": "name",
        "old_value": "jon",
        "new_value": "john",
        "datetime_modified": "some-date",
        "modified_by": "some-user"
    }
    

    其中id是记录的唯一ID,而counter只是递增的整数。

  2. 使用图形结构,并使用" delta"连接到主节点的节点,带有"修改" edge,以及存储在此节点中的相同JSON对象(+属性名称)。

  3. 历史信息有时会用于决定是否使用新信息更新记录。

    想知道两种方法的优点/缺点。

1 个答案:

答案 0 :(得分:5)

我认为您可以使用第三种方法:

  1. 创建"更新"集合,具有以下格式的文档:

    {
        reference: <_id of updated object>,
        attribute: <name of the updated attribute>,
        counter: <number>,
        old_value: ...,
        new_value: ...,
        date_modified: ...,
        modified_by: ...
    }
    

    在引用和属性上使用组合哈希索引。

  2. 这可以包含您需要的所有更新信息。

    为什么我更喜欢这种方法:

    • 缺点是您必须在某处维护每个属性的更新计数器,因为AQL中还没有_id前缀查询。这将需要获取文档中一个属性的所有更新。

    • 图形结构与我的第三种方法基本相同,但是通过创建两个你真正不需要的索引(_from_to)会产生不必要的开销。只需要其中一个。

    • 这有以上优点1.您可以按计数器和f.e.排序。轻松获得最后5个更新。此外,您不必在其他地方维护计数器或使用&#34; try-and-error&#34;找到最新的更新。高于2.它的好处是它使用组合索引而不是边缘索引,其中不使用其中一个边缘。

    示例AQL(假设您的记录存储在集合records中:

    FOR r IN records
        FILTER r.name == "super important"
        FOR update IN updates
            FILTER update.reference == r._id && update.attribute == "name"
            SORT update.counter DESC
            LIMIT 5
            RETURN update
    
相关问题