DynamoDB数据库设计(键值存储,非关系型数据库)

3

我习惯使用MySQL,现在正在努力理解如何使用键值存储。 我没有看到好的新手示例来说明数据库设计以及如何插入和获取信息。

这是否是将MySQL中的数据存储在键值存储中的正确表示?

TYPE: MySQL
TABLE: users
COLUMNS: user_id(primary), username, location

TYPE: Key Value Store
TABLE: users
KEY: user_id
VALUES: username, location

所以,如果我上面的理解是正确的。拉取通用用户信息足够简单易懂。但是在键值存储中如何执行以下查询呢?

SELECT username FROM users WHERE location = 'mexico'

我认为你可以很容易地通过创建另一个表来实现这一点。(假设有超过5,000个用户,如果只有几百个用户,我相信还有其他方法可以实现)
--Original Table--
TYPE: Key Value Store
TABLE: users
KEY: user_id
VALUES: username, location

--Additional "query" Table--
TYPE: Key Value Store
TABLE: user-location
KEY: location
VALUES: user_id

然而,当有新成员加入,更新他们的位置等情况时,现在我们需要调整两个表。这似乎不是什么大问题,只需在应用程序代码中非常准确即可。

这是解决这些问题的最佳方法吗?还是我漏掉了什么重要的东西?


1
通常来说,NoSQL 数据存储提供的功能较少。它们并不是以开发人员的生产力而闻名。 - usr
3个回答

2

更新的答案(2014年1月)

DynamoDB开始支持全局二级索引,这意味着您现在可以在位置上放置一个索引,并快速检索只居住在墨西哥的人。

请注意,在撰写本文时(可能会更改),您无法向现有表添加索引。

原始答案(2013年3月)

关于NoSQL的一般说明:
NoSQL DBMS通常专注于可扩展性。
它们还通常会增加应用程序开销,即更多的服务器端代码。

您应该问自己“我需要多少次查询来自墨西哥的用户”
答案很可能会指导您正确地建模数据库。
这也是没有“完美匹配”的原因,也没有真正的“新手样本”(至少据我所知)

现在特别看一下DynamoDB,您没有二级索引的便利(与其他一些NoSQL解决方案相反),因此您需要创建表作为索引。 在您的模型中,您可以创建一个表,其中哈希键是位置,范围键是用户ID。因此,通过QUERY API调用,您可以获取所有MEXICO用户。

您也可以考虑其他实现方式,例如将ID连接在单个对象中,但是由于DynamoDB仅允许64KB的对象 - 您可能会遇到扩展问题。


废弃的答案,使用新的全局二级索引功能。 - Daniel Steigerwald
感谢 @DanielSteigerwald - 我已更新它以反映新的 GSI 功能。 - Chen Harel

1

0

如果您的设计需要根据位置进行大量查找,则应重新设计用户表,以位置作为哈希键,userId作为范围键。 但是上述方法会删除按名称或userID查询用户的能力,而且在插入新用户时无法检查userID的唯一性(与MySql中的主键相矛盾)。

现在,如果您不经常基于位置搜索,则执行扫描操作可能是更好的解决方案。

最好的方法是根据您的需求在API级别上执行所有这些处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接