我已经习惯了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
然而,现在我们需要在有人加入时调整两个表,更新他们的位置等等。我认为这不是一个大问题,你只需要对你的应用程序代码非常准确。
这是解决这些问题的最佳方法吗?或者我错过了什么?
答案 0 :(得分:2)
更新的答案(2014年1月)
DynamoDB开始支持Global Secondary Indices,这意味着您现在可以在该位置放置一个索引,并快速检索那些在墨西哥生活的人。
请注意,在撰写本文时(可能会更改),您无法向现有表添加索引。
原始答案(2013年3月)
一般关于NoSQL的注释:
NoSQL DBMS通常关注可扩展性
它们通常还会根据更多服务器端代码添加应用程序开销。
您应该问自己“我需要多少次从墨西哥查询用户”
在为数据库建模时,答案可能会指导您采用正确的方法
这也是没有“完美契合”而且没有真正的“noob样本”的原因(至少据我所知)
现在特别关注DynamoDB,您没有二级索引的奢侈品(与其他NoSQL解决方案相比),因此您需要创建表格作为索引。
在您的模型中,您可以创建一个表,其中哈希键是位置,范围键是用户ID。因此,通过QUERY API调用,您可以获得所有MEXICO用户。
您也可以考虑其他实现,例如将ID连接在一个对象中,但同样,因为DynamoDB只允许64KB对象 - 您可能会在这里遇到扩展问题。
答案 1 :(得分:1)
以下是YouTube上的最新视频,该问题可以很好地解答。大约10分钟的标记是他们开始讨论使用DynamoDB的细节。但整个视频对于想要了解更多信息的人来说是个好消息。
网络研讨会:Amazon Dynamo数据库 - http://youtu.be/meBjA68DeIU
答案 2 :(得分:1)
不要自己管理单独的索引表。
而是使用新的global secondary index功能。
答案 3 :(得分:0)
如果你的设计最终会根据位置进行大量的查找,那么你应该重新设计用户表,其中Location为hashkey,userId为range key。 但是上面的方法删除了在用户名上或用户ID上查询用户的能力,同时插入新用户也无法检查userID中的唯一性(与MySql中的主键相反)。
现在,如果您不经常根据位置进行搜索,那么执行扫描操作可能是更好的解决方案。
最好的方法就是你提到的根据你的需要在API级别上进行所有这些处理。