我正计划开发一些应用程序,例如与 friend 的 friend 的 friend 联系。它可能看起来像 Facebook 或 Twitter,但最初我计划实现它以了解更多关于 NOSQL 数据库的信息。
NOSQL 中有许多数据库工具。我经历过许多数据库类型,如文档存储、键值存储、列类型、图形数据库。最后我想出了两个数据库工具,它们是 cassandra 和 Neo4J。选择任何一个是否正确,如果不正确,请给我一些宝贵的意见。
还有一件事是我选择的语言绑定(bind)是 JAVA。
我的问题是, 哪种数据库工具适合我的应用程序?
期待您的宝贵意见。感谢您花费宝贵的时间。
最佳答案
蒂姆,你真的应该单独发布你的问题,而不是作为对 OP 的回答,但事实并非如此。
但要回答问题,首先,请阅读 Ben Black 的幻灯片,网址为 http://www.slideshare.net/benjaminblack/introduction-to-cassandra-replication-and-consistency .
完成了吗?好的,现在进入具体问题:
“如何在后续读取中协调 [副本] 数据状态的差异?”
时间戳最高者获胜。
“所有区域都使用相同的系统时钟吗?”
时间戳由客户端(即您的应用服务器)提供。它们应该与例如同步ntpd(无论如何这是一个很好的做法),但不需要高精度,因为如果排序很重要,您应该通过使用唯一的列名或使用外部锁定来避免冲突。
例如:如果您在 Twitter 克隆中有一个关注您的用户列表,您应该为每个关注者提供自己的列,并且无论时钟多么不同步都不会丢失数据。
如果您的网站有一个管理工具,并且两个管理员“同时”上传了一个新的网站图标,那么一个更新将胜出,而哪个更新并不重要。在这里,您确实希望时钟同步,但“在几毫秒内”已经足够接近了。
如果您正在管理用户注册并且您希望仅在帐户“jbellis”不存在时才允许创建它,那么无论您的时钟有多紧密同步,您都需要一个锁管理器。
“会返回过时的数据吗?”
一个节点(一个比“区域”更值得考虑的单元)在停机期间不会丢失数据,直到它通过读取修复、提示切换或反熵修复发送该数据。同时,它会用陈旧的数据回复读取请求;如果您使用足够高的一致性级别,读取请求将等待足够多的其他回复,以确保您始终看到最新版本,这可能意味着如果有足够多的其他副本出现故障,则无法满足请求。
否则,低一致性级别(例如,ONE)隐含地意味着“我理解,通过这种较低的一致性级别可以获得更高的可用性和更低的延迟,这意味着我可以在停机后暂时看到陈旧的数据。”
关于java - 哪种 NOSQL 数据库工具更适合我的应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4850695/