任何人都可以解释Project Voldermort或类似的键值存储有用的场景吗?

时间:2009-10-20 15:42:34

标签: nosql key-value voldemort

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

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

2 个答案:

答案 0 :(得分: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 BYCOUNT。如果它是非规范化的,你可以将它存储在一个不同的表中,专门用于保存角色和拥有该角色的用户数。
  2. 您想要的数据位于同一个位置,希望在磁盘上的相同位置。您可以执行一次到几次连续读取,而不需要许多随机搜索。
  3. NoSQL DB针对这些情况进行了高度优化,您可以在这些情况下访问大多数静态的顺序数据集。那时,它只是将字节从磁盘移动到网络。减少工作量,减少开销,提高速度。尽管听起来很简单,但可以对数据和应用程序进行建模,使其感觉自然。

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

    由于您必须存储更多副本,因此您必须执行更多写入操作。这就是为什么你不能用SQL数据库实际复制这种架构的原因 - 扩展写入非常困难。

    根据我的经验,对于大规模应用而言,权衡取舍是值得的。如果您想在几个月前阅读更多关于Cassandra实际应用的信息,I wrote this piece,您可能会觉得它很有帮助。

答案 1 :(得分:2)

Project Voldermort是NoSQL运动的一部分。计算机体系结构的趋势迫使数据库朝着需要水平可扩展性的方向发展。 NOSQL试图满足这一要求。

这些Key / Value商店声称的好处之一是能够在不增加传统RDBMS的情况下吹嘘大量数据。

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