对于我们数据库中的某些节点,我们需要存储每个更改字段值的历史记录。
我们正在考虑两种可能的结构:
使用键值索引,表单为
id.attribute_name.counter = {
"field": "name",
"old_value": "jon",
"new_value": "john",
"datetime_modified": "some-date",
"modified_by": "some-user"
}
其中id
是记录的唯一ID,而counter
只是递增的整数。
使用图形结构,并使用" delta"连接到主节点的节点,带有"修改" edge,以及存储在此节点中的相同JSON对象(+属性名称)。
历史信息有时会用于决定是否使用新信息更新记录。
想知道两种方法的优点/缺点。
答案 0 :(得分:5)
我认为您可以使用第三种方法:
创建"更新"集合,具有以下格式的文档:
{
reference: <_id of updated object>,
attribute: <name of the updated attribute>,
counter: <number>,
old_value: ...,
new_value: ...,
date_modified: ...,
modified_by: ...
}
在引用和属性上使用组合哈希索引。
这可以包含您需要的所有更新信息。
为什么我更喜欢这种方法:
缺点是您必须在某处维护每个属性的更新计数器,因为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