DynamoDB - 我可以允许重复的哈希密钥

时间:2014-04-29 21:15:39

标签: c# amazon-dynamodb

我是编码C#的新手。我有一个Dynamodb表,我想允许使用相同的用户名但不同的密码。这可能吗?当我尝试创建一个新条目时,它只是用新密码替换用户名,但我想保留两个用户名不同的密码!!

这是我正在使用的代码 感谢

{
            AmazonDynamoDBClient client = new AmazonDynamoDBClient();
            string tableName = "idcheck";

            var request = new PutItemRequest
            {
                TableName = tableName,
                Item =  new Dictionary<string, AttributeValue>()
      {
          { "username", new AttributeValue { S = textBox1.Text }},
          { "password", new AttributeValue { S = textBox2.Text }},

      }

2 个答案:

答案 0 :(得分:2)

DynamoDB表的表键必须是唯一的。要完成您想要执行的操作,您可以使用组合键,用户email作为哈希键,password作为范围键。听起来username是您表格的哈希键,而您没有范围键,这就是当前条目被覆盖的原因。您需要创建一个具有范围键的新表,并为每个用户名设置一个唯一的范围键,以便为用户名设置多个值。

话虽如此,你永远不应该永远以纯文本存储密码。密码应在存储中进行散列和盐渍。您可能要做的一件事是使用UUID或时间戳作为范围键和密码的盐,并将散列和盐渍密码存储为表的常规元素。

无论您做什么,都要查找密码存储最佳做法,并且不要以明文形式存储密码。

答案 1 :(得分:2)

首先,您似乎应该使用email作为哈希键,并使用password作为范围键。这样在DynamoDB中,您将能够获得以下数据:

email (Hash Key)        | password (Range Key)  
------------------------|-------------------------------------
user1@gmail.com         | be655ea0-8332-44db-9319-1e22da74b2b3
user1@gmail.com         | aa5bf017-57e3-419c-acd2-d2f68a73d913
user2@gmail.com         | 48bee58a-07a4-4154-aea4-10a531909184

但这是关系数据库设计,它只在关系数据库中蓬勃发展。在DynamoDB中,您通常具有有限的查询功能,您可能希望从此用例中释放Range Key以获得更有目的性。

相反,在像DynamoDB这样的平面NoSQL数据库中,您可以执行以下操作,将email作为您的哈希密钥,并使用String Set来存储所有密码:

email (Hash Key)        | password (String Set)
------------------------|---------------------------------------------------------------------------------
user1@gmail.com         | ['be655ea0-8332-44db-9319-1e22da74b2b3', 'aa5bf017-57e3-419c-acd2-d2f68a73d913']
user2@gmail.com         | ['48bee58a-07a4-4154-aea4-10a531909184']

请注意以下解决方案:

  1. DynamoDB中的每一行/项目的总数据上限为64KB,但您可以随时存储大约1.7k个密码。我认为这应该足够了。