Als je in dynamodb uniciteit wilt afdwingen in een ander veld dan de primaire sleutel (zoals wanneer je een gebruikerstabel hebt en unieke e-mailadressen voor gebruikers wilt terwijl de primaire sleutel een gebruikers-ID is dat een getal is), is er een manier behalve het scannen van de tabel om te zien of de e-mail al in gebruik is?
Antwoord 1, autoriteit 100%
Kort antwoord: Nee.
DynamoDB is een key:value-archief. Het is erg goed in het snel ophalen/opslaan van items, omdat het een paar compromissen sluit. Dit is een beperking waar u zelf mee om moet gaan.
Niettemin, afhankelijk van uw werkelijke model, kan het een goed idee zijn om dit veld te gebruiken als u hash_key
of om een range_key
te gebruiken
Als dit niet mogelijk is, raad ik je aan om je gegevens te de-normaliseren. Je hebt momenteel zoiets als:
UserTable
hash_key
:user_id
e-mail
- …
Om uniciteit te garanderen, voegt u een nieuwe tabel toe met dit schema:
EmailUser
hash_key
: e-mailuser_id
Om er zeker van te zijn dat een e-mail uniek is, geeft u eerst een GetItem
op aan EmailUser
.
Dit soort de-normalisatie komt vrij vaak voor bij No-SQL-databases.
Antwoord 2, autoriteit 11%
Er is niet zo’n manier waarop je uniciteit op andere attributen kunt afdwingen, maar met behulp van de boto3-bibliotheek van Python kun je de client gebruiken om een transactie-item uit te voeren en een samengestelde sleutel te gebruiken en proberen je invoer te dupliceren en ze allemaal in één keer in te voegen met behulp van transact_write_items ().
Er is zeer mooie documentatie van aws hierover:
https://aws.amazon. com/fr/blogs/database/simulating-amazon-dynamodb-unique-constraints-using-transacties/
Antwoord 3, autoriteit 9%
Ik denk niet dat de onderstaande benadering wordt besproken of niet, dus plaats de relevante link om een unieke e-mail (of een ander kenmerk) te garanderen. Dit vereist niet het aanmaken van een andere tabel, maar om extra items toe te voegen aan de Gebruikerstabel in de primaire sleutelkolom.
Alternatieve benadering om unieke kenmerken te garanderen in DynamoDB
Antwoord 4, autoriteit 4%
De DynamoDB op zich ondersteunt geen unieke beperkingen, maar u kunt op de een of andere manier zorgen voor uniciteit door atomic counter
te gebruiken en deze tellerwaarde in uw gegevens op te nemen.
In mijn geval moet ik ervoor zorgen dat zowel username
als userId
geen duplicaten hebben. username
is mijn partitiesleutel, dus ik zal geen problemen hebben om de attribute_not_exists(username)
te gebruiken om overschrijven te voorkomen;
Voor userId
zal ik eerst een nieuwe waarde ophalen uit de atomaire teller en deze dan als mijn userId-waarde plaatsen. Het is misschien niet volledig sequentieel, maar het kan in deze zin uniek zijn.