我可以看到自己使用Project Voldermort来缓存来自传统 RDBMS 查询的结果。但在这种情况下,与其他(Java)缓存系统(如 EHcache Jcache 等)相比,它几乎没有提供任何主要优势。
我还能在哪里使用 Project Voldermort 或类似的 Key Value 商店?您如何在业务应用程序中使用它?
我可以看到自己使用Project Voldermort来缓存来自传统 RDBMS 查询的结果。但在这种情况下,与其他(Java)缓存系统(如 EHcache Jcache 等)相比,它几乎没有提供任何主要优势。
我还能在哪里使用 Project Voldermort 或类似的 Key Value 商店?您如何在业务应用程序中使用它?
提高数据库速度的一种方法是非规范化。以这个 MySQL 为例:
CREATE TABLE `users` (
`user_id` INT NOT NULL AUTO_INCREMENT,
… -- Additional user data
PRIMARY KEY (`user_id`)
);
CREATE TABLE `roles` (
`role_id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(64),
PRIMARY KEY (`role_id`)
);
CREATE TABLE `users_roles` (
`user_id` INT NOT NULL,
`role_id` INT NOT NULL,
PRIMARY KEY (`user_id`, `role_id`)
);
整洁,整洁,规范。但是如果你想获取用户和他们的角色,查询很复杂:
SELECT u.*, r.*
FROM `users` u
LEFT JOIN `user_roles` ur ON u.`user_id` = ur.`user_id`
JOIN `roles` r ON ur.`role_id` = r.`role_id`;
如果你对此进行非规范化,它可能看起来像:
CREATE TABLE `users` (
`user_id` INT NOT NULL AUTO_INCREMENT,
`role` VARCHAR(64),
… -- Additional user data
PRIMARY KEY (`user_id`)
);
等效的查询是:
SELECT * FROM `users`;
这提高了查询的一些性能特征:
GROUP BY
and COUNT
。如果它被非规范化,您会将其存储在一个不同的表中,该表专门用于保存角色和拥有该角色的用户的数量。NoSQL DB 针对这些情况进行了高度优化,您希望在这些情况下访问大部分是静态的顺序数据集。那时,它只是将字节从磁盘移动到网络。更少的工作,更少的开销,更快的速度。尽管这听起来很简单,但可以对您的数据和应用程序进行建模,使其感觉自然。
这种性能的权衡是写入负载、磁盘空间和一些应用程序的复杂性。非规范化数据意味着更多的副本,这意味着更多的磁盘空间和写入负载。本质上,每个查询都有一个数据集。因为您将这些计算的负担转移到写入时间而不是读取时间,所以您确实需要某种异步机制来做到这一点,因此会增加一些应用程序的复杂性。
而且因为您必须存储更多副本,所以您必须执行更多写入。这就是为什么您实际上无法使用 SQL 数据库复制这种架构的原因——扩展写入非常困难。
根据我的经验,这种权衡对于大规模应用程序来说是非常值得的。如果您想阅读更多有关 Cassandra 实际应用的信息,我在几个月前写了这篇文章,您可能会发现它很有帮助。
Project Voldermort 是NoSQL运动的一部分。计算机体系结构的趋势正在将数据库推向需要水平可扩展性的方向。NOSQL 试图解决这个要求。
这种键/值存储声称的好处之一是能够在没有传统 RDBMS 开销的情况下处理大量数据。
http://www.computerworld.com/s/article/9135086/No_to_SQL_Anti_database_movement_gains_steam_