文件结构
-user
- firstName
- lastName
...
- session
- table1
- filters, searches, states etc
- table2
- filters, searches, states etc
...
问题:我应该将会话数据保存在用户文档中还是单独的文档中?
如果用户登录,我们会查询整个文档:
query = 'find the user... return u
如果用户退出,我们会保存用户,包括其会话状态
如果显示用户列表,我们只查询所需的文档字段:
query = 'for u in users.... return
{firstName: u.firstName, lastName: u.lastName}
思考:虽然我们只查询我们需要的数据,但文档的大小是否会影响后台的DB性能?就像Arangodb在后台获取整个文档一样,只返回部分内容之前?或者可能是受更大文档大小影响的任何其他服务器进程?
答案 0 :(得分:2)
ArangoDB获取完整文档。您应避免使用大型文档以获得最佳性能。您可以看到here一个如何从RocksDB键值存储
接收文档的示例答案 1 :(得分:1)
会话数据需要与用户相关联,因此将其存储在用户顶点上更有意义,否则您可以存储在单独的顶点上并对其进行引用(图中的边缘)。对于经常根据请求提供服务的用户,缓存用户数据可能证明是有效的,而不是现在每次查询数据库。
如果用户处于活动状态,您可以将会话放在缓存等中间存储中以便更快地访问,并且可以在他注销时或以指定的时间间隔将其写入db。
如果文档大小不断增加,您可以考虑最近的n
个会话数(取决于您的应用程序域和业务要求),因为用户首选项会发生变化,以包含每个文档的大小。
是的,在arango查询的情况下,在查询优化器应用索引和其他优化之前获取整个文档,这会对性能产生影响。