Jason. La solution de Sam est très utile mais, comme vous le dites, elle n'est peut-être pas parfaite pour vous. Je peux penser à deux autres options. Imaginez un instant que vous êtes de retour dans SQL. Quelle est la clé primaire d'un utilisateur? Ce n'est ni le nom d'utilisateur ni l'email mais les deux colonnes. Idem pour CouchDB.
Donc, à absolument garantir l'unicité, la réponse est simple: il doit être le doc _id
. Par exemple, pour l'utilisateur "jason" avec le courrier électronique "[email protected]", POST ce doc:
{ "_id": "jason:[email protected]",
"other stuff": "blah blah blah"
}
C'est atomique, transactionnel, la création d'utilisateurs. Il pourrait:
- Succeed, maintenant que vous avez votre nouveau document utilisateur
- Fail parce que id existe déjà et vous (intentionnellement) a oublié la propriété
_rev
. Super, ce combo utilisateur/email est déjà pris!
Bien sûr, simplement vérifier si le nom est disponible, vous pouvez GET /db/jason:[email protected]
. (Vous pouvez préfixer l'ID comme le fait la base de données _users
, comme users:jason:[email protected]
— c'est à vous de décider.) Ensuite, vous pouvez POST
revenir plus tard. Il y a une chance que cela soit pris entre temps, mais c'est normal dans tous les formulaires "vérifier d'abord, réserver plus tard" qui sont assez courants sur le web maintenant.
La deuxième idée est plus juste de réfléchir soigneusement à votre situation. Vous avez dit que deux utilisateurs peuvent avoir le même nom d'utilisateur: et. Cela semble étrange. Peut-être que j'ai mal lu. Voici quelques choses à penser:
- Presque personne actions un compte e-mail avec quelqu'un d'autre. Pourquoi ne pas en faire le nom de connexion actuel? C'est assez bon pour Facebook. Alors le "nom d'utilisateur" peut juste être le surnom d'un utilisateur ou manipuler dans le système, juste une propriété dans le document d'utilisateur.
- Deux requêtes HTTP peuvent ne pas être si mauvaises.Je pense que de cette façon:
- Si ceci est une architecture 3-tier (serveur web dédié, backend CouchDB), puis deux requêtes HTTP est pas grand
- Si c'est un 2-tier ou hybride (où les navigateurs tapent directement sur couchdb), puis pensez fortement à utiliser CouchDB pour l'authentification, décrite dans le CouchDB book. CouchDB peut gérer les connexions pour vous, avec un formulaire ou AJAX. Ce n'est pas parfait pour toutes les situations, mais vous obtenez un excellent rapport qualité-prix.
duplication possible de [Contraintes uniques dans couchdb] (http://stackoverflow.com/questions/1541239/unique-constraints-in-couchdb) – Flimzy