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

Rah*_* PK 3 ruby-on-rails amazon-dynamodb

嗨iam new in dynamo db,据我所知它是一个非关系数据库,即我们不能加入表.我怀疑的是我们如何设计表格结构.请用以下例子说明.

我有以下表格1)用户 - user_id,用户名,密码,电子邮件,电话号码,角色2)角色 - id,name [即admin,supervisor,ect ..]

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

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

小智 6

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

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

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

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

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

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

希望这可以帮助!