我们如何设计Dynamo db与两个实体保持关系

时间:2012-02-27 08:36:08

标签: ruby-on-rails amazon-dynamodb

嗨,我在Dynamo db中是新的,据我所知,它是一个非关系数据库,即我们无法加入表。我怀疑的是我们如何设计表格结构。请通过以下示例澄清。

我有下表 1)用户 - user_id,用户名,密码,电子邮件,电话号码,角色 2)角色 - id,名称[即管理员,主管,等等]

a)我首先怀疑是否有任何规定为user_id字段设置自动增量? b)这是将主键设置为user_id的正确方法吗? c)这是在dynamo db中存储用户角色的正确方法吗?即一个角色表包含​​用户表中的ID和标题以及商店角色ID? e)这可以和每个用户一起检索两个表数据吗?我使用的是rails 3和aws-sdk gem

如果有人回复,对我来说就像一个新的dynamodb用户一样非常有帮助

2 个答案:

答案 0 :(得分:6)

通常使用nosql样式数据库,您可以提供唯一标识符,而不是让自动增量PK字段为您执行此操作。这通常意味着您将GUID作为每个用户记录的密钥。

就用户角色而言,有很多方法可以实现这一目标,每种方法都有好处和问题:

一种简单的方法是向Users表添加“Role”属性,并为该用户的每个角色分配一个条目。然后你可以抓住用户,你将在一个查询中拥有所有角色。 DynamoDB允许属性具有多个值,因此每个角色一个属性可以有一个值。

如果您需要能够查询特定角色的用户(即“给我所有的主管用户”),那么您将在DynamoDB中进行表扫描,这可能是一项昂贵的操作。但是,如果您的用户数量相当小,并且需要进行此类查找的次数很少,那么您的应用程序仍然可以接受。

如果你真的需要经常进行这种昂贵的查找,那么你需要创建一个类似于“RolesWithUsers”的新表,每个角色有一条记录,角色记录中的用户的userIds。对于大多数应用程序,我建议不要做这样的事情,因为现在你有两个表代表一个事实:特定用户有什么角色。因此,每次需要在两个地方进行删除或更新。并非不可能,但需要更多的警惕和测试,以确保您的应用程序不会得到错误的数据。这种方法的另一个缺点是,您需要两个查询来获取信息,这可能比表扫描更昂贵,具体取决于记录的数量。

对于这个特定用例有意义的另一个选择是使用SimpleDb。它具有更好的查询功能(所有属性都默认为索引),在这种情况下,具有多值属性角色的单个表将比DynamoDB更好。

希望这有帮助!

答案 1 :(得分:0)

我们有类似的情况,我们只使用两个DB,一个关系和一个NoSQL(Dynamo)。对于“用户”对象,与关系相关的其他事物(如角色,项目,技能等)以及与用户有关的所有内容(属性等)都包含在Dynamo中。如果我们需要向用户添加新属性,那很好,因为NoSQL不关心这些属性。经验法则是,如果我们只需要该对象页面上的某些内容(也就是说,我们不需要与其他对象关联),那么我们就会放入Dynamo。否则,它会发生关系。

在你跨越一个小门槛之后,在NoSQL DB上使用表格扫描并不是一个真正的选择(到目前为止,你可以只使用内存数据库)。