我是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 }},
}
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']
请注意此解决方案的以下内容:
- DynamoDB中的每一行/项的总数据上限为
64KB
,但随着时间的推移,您可以存储大约1.7k个密码。我认为这就足够了