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

本文关键字:哈希 密钥 许重复 我可以 DynamoDB- | 更新日期: 2023-09-27 18:00:44

我是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 }},
      }

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

DynamoDB表的表键必须是唯一的。为了完成您想要做的事情,您可以使用一个复合密钥,其中用户email作为散列密钥,password作为范围密钥。听起来username是表的哈希键,而您没有范围键,这就是当前条目被覆盖的原因。您需要创建一个具有范围键的新表,并为每个用户名提供一个唯一的范围键,以便为一个用户名提供多个值。

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

无论你做什么,都要查找密码存储的最佳实践,不要将密码存储为纯文本。

一开始,似乎应该使用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个密码。我认为这就足够了