我已经习惯了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然而,现在我们需要在新加入的人加入、更新他们的位置等情况下调整两个表。我想这不是什么大问题,你只需要对你的应用程序代码非常准确。
这是解决这些问题的最好方法吗?还是我错过了什么?
发布于 2012-03-20 00:55:32
更新答案(2014年1月)
DynamoDB开始支持Global Secondary Indices,这意味着你现在可以在位置上建立索引,并只快速检索那些生活在墨西哥的人。
请注意,在编写本文时(这可能会发生变化),您不能向现有表中添加索引。
原始答案(2013年3月)
关于NoSQL的一般说明:
NoSQL数据库管理系统通常关注可伸缩性。
它们通常还会增加更多服务器端代码的应用程序开销。
你应该问自己“我需要向来自墨西哥的用户查询多少次”
在对数据库进行建模时,答案可能会指导您采用正确的方法。
这也是为什么没有“完美匹配”和没有真正的“菜鸟样本”(至少据我所知)的原因。
现在特别来看一下DynamoDB,您没有足够的辅助索引(与其他具有辅助索引的NoSQL解决方案相反),因此需要创建表作为索引。在您的模型中,您可以创建一个表,其中哈希键是位置,范围键是用户id。因此,通过一个查询API调用,您可以获得所有墨西哥用户。
您还可以考虑其他实现,例如将in连接在单个对象中,但是,由于DynamoDB只允许64KB的对象-在这里您可能会遇到伸缩问题。
发布于 2014-01-10 05:09:17
不要自己管理单独的索引表。
相反,请使用新的global secondary index功能。
发布于 2012-03-30 16:28:16
如果您的设计要求您最终根据位置进行大量查找,那么您应该重新设计用户表,将location作为hashkey,将userId作为范围键。但是上面的方法删除了查询用户姓名或userID的功能,并且在插入新用户时不能检查userID中的唯一性(与MySql中的主键所做的事情相矛盾)。
现在,如果您不经常基于位置进行搜索,那么执行扫描操作可能是更好的解决方案。
正如您所提到的,最好的方法是根据您的需要在API级别上执行所有这些处理。
https://stackoverflow.com/questions/9752262
复制相似问题