您好我正在使用neo4j和node实现聊天App。我很困惑将每个聊天消息存储为图形中的节点,这导致大量节点。我们可以构建一个结构,其中一个节点代表一个char房间,并使用其他方法(如文本)存储聊天。任何人都可以告诉在图中存储消息的最佳方法
答案 0 :(得分:3)
图形数据库用于存储数据之间的连接。它适用于它的设计用途。您提到的聊天应用程序不是图形数据库的正确用例。也许你可以使用图形数据库来存储用户'友谊,这对图数据库来说真的很好。但是消息是某种日志样式数据。它不是数据之间的关系。对于聊天消息,日期信息比关系更重要。所以,我认为您可以使用另一个DBMS来存储聊天消息而不是图形数据库。
另一种选择是使用支持多种数据模型的混合数据库。其中一个DBMS是AgensGraph(https://github.com/bitnine-oss/agens-graph)。它提供图形数据库功能,包括基于关系数据库的Cypher支持,PostgreSQL。所以你可以存储用户'图形对象和用户之间的关系'关系表中的聊天消息。因此,使用AgensGraph,您可以根据数据的属性优化存储。
答案 1 :(得分:2)
假设您要将每条消息建模为自己的节点,考虑到您的朦胧需求,我可以想到两种可能的消息建模方式。
一个是,对于聊天室节点,将所有消息附加到具有发布日期的聊天室节点,并且用于获取聊天室中所有消息的查询将按发布日期排序。
请记住,即使您在发布日期上添加索引:消息节点,在执行ORDER BY操作时当前也不使用索引,因此随着消息数量的增长,期望查看速度会降低每个聊天室。
另一个选项是链表结构,其中消息按顺序附加到列表中。在附加到消息列表之前,您需要在聊天节点(或聊天室节点之外的头节点,如果始终在聊天室节点和消息列表之间使用头节点)上获取写锁定,以避免竞争条件这可能会列出清单。
答案 2 :(得分:2)
不是将文本消息保存为图形中的节点,而是最好使用RDBMS系统。它们针对这类事情进行了优化,如果数据集不是很大,那就做得很好(看看Hadoop,Couch或类似的东西)。
如果您坚持使用图表,请尝试像AgensGraph这样的混合数据库,它将图形与RDBMS数据库集成在一起。您可以在图数据库上使用Cypher,在关系数据库上使用SQL。