4

我可以看到自己使用Project Voldermort来缓存来自传统 RDBMS 查询的结果。但在这种情况下,与其他(Java)缓存系统(如 EHcache Jcache 等)相比,它几乎没有提供任何主要优势。

我还能在哪里使用 Project Voldermort 或类似的 Key Value 商店?您如何在业务应用程序中使用它?

4

2 回答 2

4

提高数据库速度的一种方法是非规范化。以这个 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`;

这提高了查询的一些性能特征:

  1. 因为您想要的结果已经在表格中,所以您不必执行读取端计算。例如,如果您想查看具有给定角色的用户数量,您需要一个GROUP BYand COUNT。如果它被非规范化,您会将其存储在一个不同的表中,该表专门用于保存角色和拥有该角色的用户的数量。
  2. 你想要的数据在同一个地方,希望在磁盘上的同一个地方。您可以执行一到几个顺序读取,而不是需要许多随机搜索。

NoSQL DB 针对这些情况进行了高度优化,您希望在这些情况下访问大部分是静态的顺序数据集。那时,它只是将字节从磁盘移动到网络。更少的工作,更少的开销,更快的速度。尽管这听起来很简单,但可以对您的数据和应用程序进行建模,使其感觉自然。

这种性能的权衡是写入负载、磁盘空间和一些应用程序的复杂性。非规范化数据意味着更多的副本,这意味着更多的磁盘空间和写入负载。本质上,每个查询都有一个数据集。因为您将这些计算的负担转移到写入时间而不是读取时间,所以您确实需要某种异步机制来做到这一点,因此会增加一些应用程序的复杂性。

而且因为您必须存储更多副本,所以您必须执行更多写入。这就是为什么您实际上无法使用 SQL 数据库复制这种架构的原因——扩展写入非常困难。

根据我的经验,这种权衡对于大规模应用程序来说是非常值得的。如果您想阅读更多有关 Cassandra 实际应用的信息,我在几个月前写了这篇文章,您可能会发现它很有帮助。

于 2009-12-30T07:23:31.577 回答
2

Project Voldermort 是NoSQL运动的一部分。计算机体系结构的趋势正在将数据库推向需要水平可扩展性的方向。NOSQL 试图解决这个要求。

这种键/值存储声称的好处之一是能够在没有传统 RDBMS 开销的情况下处理大量数据。

http://www.computerworld.com/s/article/9135086/No_to_SQL_Anti_database_movement_gains_steam_

于 2009-10-20T15:56:52.920 回答