Quelle est la meilleure pratique lors de la création d'IDs de documents dans couchdb? [fermé]
Nous savons tous que pour les bases de données relationnelles, il est préférable d'utiliser numériques Id de la clé primaire.
dans couchdb, L'ID par défaut généré est un UUID. Est-il préférable de s'en tenir à la valeur par défaut, ou d'utiliser un facilement mémorisable identifiant qui sera utilisé dans l'application par l'utilisateur?
par exemple, si vous concevez stackoverflow.com base de données dans couchdb, voulez-vous utiliser la question slug (eg. qu'est-ce-est-meilleur-pratique-quand-la création d'-document-id-en-couchdb) ou un UUID pour chaque document?
6 réponses
Je ne suis pas expert en couchdb, mais après avoir fait quelques recherches, c'est ce que j'ai trouvé.
la réponse simple est, utilisez UUIDs sauf si vous avez une bonne raison de ne pas le faire.
La plus longue réponse est, il dépend:
coà " t de la modification de L'ID par rapport à la probabilità © de la modification de L'ID
Faible coût du changement et susceptibles de changer l'ID
un exemple de ceci pourrait être un blog avec un design dénormalisé tel que jchris" blog (code sofa disponible sur Git hub).
chaque fois qu'un autre site web renvoie à un billet de blog, c'est une autre référence à l'id, donc le coût de modification de l'id augmente.
coût élevé du changement D'ID et D'une ID qui ne changera jamais
un exemple de ceci est tout design de base de données qui est fortement normalisé et qui utilise des identificateurs d'auto-incrément. Stackoverflow.com est un bon exemple avec son auto-incrémentation question IDs que vous voir dans chaque URL. Le coût de la modification de la carte D'identité est extrêmement élevé, car chaque clé étrangère devrait être mise à jour.
combien de références, ou "clés étrangères" (en langage relationnel DB) y aura-t-il à l'id?
toute "clé étrangère" augmentera considérablement le coût de la modification de L'ID. La mise à jour d'autres documents est une opération lente et certainement devrait être évitée.
Quelle est la probabilité que L'ID le changement?
si vous ne voulez pas utiliser UUIDs vous avez probablement déjà une idée de ce que vous voulez utiliser ID.
si elle est susceptible de changer, le coût de la modification de L'ID devrait être faible. Si ce n'est pas le cas, choisissez une autre pièce d'identité.
Quelle est votre motivation pour vouloir utiliser une pièce d'identité facilement mémorable?
ne dites pas performance.
Repères show que " les recherches des clés de vue de CouchDB sont presque, mais pas tout à fait, aussi vite que la recherche directe de documents". Cela signifie qu'avoir à faire une recherche pour trouver un disque n'est pas une grosse affaire. Ne choisissez pas des identifiants conviviaux juste parce que vous pouvez faire une recherche directe sur un document.
allez-vous faire de nombreuses insertions?
si c'est le cas, il est préférable d'utiliser des UUID incrémentiels pour une meilleure performance.
Voir le post à propos des inserts en vrac. Damien Katz commente et dit:
"Si vous voulez ont le plus temps d'insertion possible, vous devez donner les valeurs ascendantes de _id, UUID et incrémenter par 1, de cette façon c'est toujours l'insertion dans la même place dans l'index, et être cache amical une fois que vous avez affaire à fichiers plus gros que RAM. Pour faciliter la façon de faire la même chose, juste numéroter séquentiellement les documents, mais faites-le de longueur fixe avec rembourrage ainsi qu'ils trient correctement, "0000001" au lieu de "1" par exemple."
venant d'un point de vue de base de données relationnelle, il m'a fallu un certain temps pour comprendre couchdb. Mais la vérité est le contraire de la réponse d'acceptation;
au lieu d'utiliser un uuid par défaut, générer un smart id peut vous aider grandement à extraire et trier des données.
dites que vous avez une base de données de films. Tous les documents peuvent être trouvés quelque part sous L'URL / films, mais où exactement?
si vous stockez un document avec le _id Jabberwocky ({"_id":"Jabberwocky"}) dans votre base de données de films, il sera disponible sous l'URL /films/Jabberwocky. Ainsi, si vous envoyez une requête GET à /movies/Jabberwocky, vous récupérerez le JSON qui constitue votre document ({"_id":"Jabberwocky"}).
http://guide.couchdb.org/draft/documents.html
Conseil de Performance: si vous utilisez simplement les ID doc générés au hasard, alors vous ne manquez pas seulement une occasion d'obtenir un index gratuit – vous avez aussi la charge de construire un index que vous n'utiliserez jamais. Alors utilisez et abusez de vos papiers!
https://pouchdb.com/2014/05/01/secondary-indexes-have-landed-in-pouchdb.html
je me rends compte que c'est une question à longue réponse, mais il y a une autre considération importante pour ceux qui découvrent la question. Lorsqu'un document est supprimé, tout ce que vous savez, c'est l'id. Tapant, explicite (type:foo
) ou implicite (duck-typing) ne fonctionne pas. Vous ne pouvez donc pas vous abonner aux modifications pour doc.deleted===true && doc.type==foo
, parce qu'après la suppression,doc.type===undefined
. _id
valeur que vous pouvez décoder post-hoc est utile, en particulier si votre code client doit être autrement apatride (et ne peut donc pas être cache une liste de _id
s par type).
_id est utilisé beaucoup dans les internes de CouchDB et tout coût supplémentaire de hachage va ralentir une partie des internes donc il est préférable de s'en tenir à L'UUID fourni.
vous pouvez utiliser L'id CouchDB par défaut( UUID), comme indiqué dans le documentation les principales raisons d'utiliser UUID par défaut sont les suivantes:
- UUIDs sont des nombres aléatoires qui ont une si faible probabilité de collision que tout le monde peut faire des milliers D'UUIDs par minute pendant des millions d'années sans jamais créer un double.C'est une excellente façon de s'assurer que deux personnes indépendantes ne peuvent pas créer deux documents différents avec la même pièce d'identité.
- CouchDB la réplication vous permet de partager des documents avec d'autres et L'utilisation D'UUIDs garantit que tout fonctionne.
maintenant, d'un autre côté, si vous comptez sur le serveur(CouchDB) pour générer L'UUID et que vous finissez par faire deux requêtes POST parce que la première requête POST a été bombée, vous pourriez générer deux docs et ne jamais découvrir la première parce que seule la seconde sera rapportée, donc, c'est une bonne idée de générer vos propres UUIDs pour s'assurer que vous ne finirez jamais avec un duplicata documents, mais je vais certainement aller avec UUID sauf si vous avez spécifiquement besoin autrement. documenta.
la clé primaire D'un DB ne devrait jamais avoir de "sens", sauf peut-être pour encoder la séquence. Vous pourriez vouloir changer la balle, mais pas la clé primaire.
il pourrait y avoir un bon argument pour utiliser quelque chose à partir d'un timestamp pour avoir un ordre inhérent dans vos clés. J'utilise souvent "%f@%s" % (time(), le nom d'hôte()) pour obtenir commandé, clés uniques. (Cela ne fonctionne que si votre implémentation de time () ne renvoie jamais la même valeur deux fois.)
pour d'autres choses (par exemple des images) , là où je veux éviter les doublons, j'utilise souvent sha (data) comme clé.