2009-12-26 11 views
25

Todos sabemos que para las bases de datos relacionales, es una buena práctica usar identificadores numéricos para la clave principal.¿Cuál es la mejor práctica al crear identificaciones de documentos en couchdb?

En couchdb la ID predeterminada que se genera es UUID. ¿Es mejor seguir con el valor predeterminado o utilizar un identificador fácil de recordar que el usuario utilizará en la aplicación?

Por ejemplo, si estuviera diseñando la base de datos stackoverflow.com en couchdb, ¿usaría la pregunta slug (por ejemplo, what-is-best-practice-when-creating-document-ids-in-couchdb) o una UUID para cada documento?

Respuesta

18

No soy un experto en sofá, pero después de investigar un poco, esto es lo que encontré.

La respuesta simple es usar UUID a menos que tenga una buena razón para no hacerlo.

La respuesta larga es, depende de:

costo de cambiar ID Vs ¿Qué tan probable es el ID para cambiar

bajo costo de cambiar y es probable que cambie ID

Un ejemplo de esto podría ser un blog con un diseño desnormalizado como jchris' blog (sofa code available on git hub).

Cada vez que otro sitio web enlace a una publicación de blog, esta es otra referencia a la identificación, por lo que el costo de cambiar la identificación aumenta.

Alto coste de cambio de ID y un ID que nunca cambiará

Un ejemplo de esto es cualquier diseño DB que está altamente normalizado que utiliza identificadores de incremento automático. Stackoverflow.com es un buen ejemplo con sus Id. De pregunta de incremento automático que puede ver en cada URL. El costo de cambiar la ID es extremadamente alto ya que todas las claves extranjeras tendrían que actualizarse.

¿Cuántas referencias, o "claves foráneas" (en lenguaje DB relacional) habrá para la identificación?

Cualquier "clave externa" aumentará en gran medida el costo de cambiar la ID. Tener que actualizar otros documentos es una operación lenta y definitivamente debe evitarse.

¿Qué posibilidades hay de que cambie la identificación?

Si no desea utilizar UUID probablemente ya tenga una idea de qué ID desea usar.

Si es probable que cambie, el costo de cambiar la ID debe ser bajo. Si no es así, elija una ID diferente.

¿Cuál es su motivación para querer usar una identificación fácil de recordar?

No digas rendimiento.

Benchmarks show que "las búsquedas de teclas de vista de CouchDB son casi, pero no del todo, tan rápidas como las búsquedas directas de documentos". Esto significa que tener que hacer una búsqueda para encontrar un registro no es gran cosa. No elija identificadores amigables solo porque puede hacer una búsqueda directa en un documento.

¿Va a hacer muchas inserciones a granel?

Si es así, es mejor usar UUID incrementales para un mejor rendimiento.

Consulte este post sobre inserciones a granel. comentarios y dice Damien Katz:

"Si usted quiere tener el más rápido posibles tiempos de inserción, debe dar valores ascendentes de _ID, a fin de obtener un UUID ay se incrementará en 1, de esa manera siempre insertando en el mismo lugar en el índice, y siendo caché de usar una vez que se trata de archivos de más de RAM. para un manera más fácil de hacer lo mismo, simplemente número secuencial de los documentos, pero que sea de longitud fija con relleno tan que ordenan correctamente, "0000001" en lugar de "1", por ejemplo. "

+5

Esta respuesta parece basa en la idea de que la prevención de conflictos es siempre deseable; sin embargo, a veces los conflictos son una parte natural del dominio del problema y, en lugar de simplemente evitarlos, deben detectarse y resolverse de manera proactiva. En tales casos, una identificación natural es una excelente opción. Por ejemplo, no use el título de una publicación de blog como ID en un sistema multiusuario masivo, pero sí use el nombre de dominio totalmente calificado y la dirección IP al modelar registros de direcciones DNS. – user359996

+1

Este artículo explica bien el impacto de los UUID aleatorios en el rendimiento de CouchDB http://blog.inoi.fi/2010/11/impact-of-document-ids-on-performance.html – Lebugg

+1

Después de haber utilizado CouchDB en varias fuentes comerciales y de código abierto proyectos, estoy totalmente en desacuerdo con esta respuesta. No tiene en cuenta cómo funcionan las ID en Couch (inmutable, utilizado para la clasificación, debe ser único en toda la base de datos, importancia para la replicación, etc.). – theDmi

-1

La clave primaria en un DB nunca debe tener ningún "significado" excepto tal vez para codificar la secuencia. Es posible que desee cambiar el SLUG pero no la clave principal.

Puede haber un buen argumento para usar algo que comience con una marca de tiempo para tener un orden inherente en sus claves. A menudo uso "% f @% s"% (time(), hostname()) para obtener claves únicas y ordenadas. (Esto solo funciona si su implementación time() nunca devuelve el mismo valor dos veces).

Para otras cosas (por ejemplo, imágenes), donde quiero evitar duplicados, a menudo utilizo sha (datos) como clave.

0

_ID se utiliza una gran cantidad en las partes internas CouchDB y cualquier costo adicional de hash va a frenar un montón de las partes internas por lo que es mejor seguir con el UUID proporcionado.

+4

Estoy confundido. ¿Qué quiere decir con "costo extra de hash"? ¿Estás diciendo que una ID generada por el usuario terminará en hash, internamente, mientras que un UUID generado automáticamente no lo hará? – user359996

+0

¿Podría estar refiriéndose a la longitud de un _id (mayor costo para cortar una cadena más larga)? – Nevir

2

Me doy cuenta de que esta es una pregunta largamente respondida, pero hay otra consideración importante para aquellos que descubren el problema. Cuando se elimina un documento, todo lo que sabes sobre él es la identificación. Escribir, ya sea explícito (type:foo) o implícito (pato escribiendo) no funciona. Por lo tanto, no puede suscribirse a los cambios para doc.deleted===true && doc.type==foo, porque después de la eliminación, doc.type===undefined. Un valor _id que puede decodificar post-hoc es útil, particularmente si su código de cliente necesita ser de otro modo sin estado (y por lo tanto no puede almacenar en caché una lista de _id por tipo).

+0

Me doy cuenta de que esta es una respuesta antigua, pero puede evitarlo, en lugar de emitir un BORRADO en el documento, actualizando el documento con un campo '" _deleted ": true' en la raíz. Sin embargo, asegurarse de que su código solo use esta estrategia probablemente sea doloroso y propenso a errores. – dhasenan

0

Usted podría ir con el CouchDB Identificación del defecto (UUID), como se dijo en los documentation las principales razones para utilizar UUID por defecto son los siguientes:

  • UUID son números aleatorios que tienen una probabilidad de colisión tan baja que todos pueden generar miles de UUID por minuto durante millones de años sin crear un duplicado. Esta es una gran manera de garantizar que dos personas independientes no puedan crear dos documentos diferentes con la misma ID.
  • La replicación de CouchDB le permite compartir documentos con otras personas y el uso de UUID garantiza que todo funcione.

Ahora, por otro lado, si usted confía en el servidor (CouchDB) para generar el UUID y se termina haciendo dos peticiones POST debido a que la primera solicitud POST bombardeada, es posible generar dos documentos y nunca encontrar sobre el primero porque solo se informará el segundo, por lo tanto, es una buena idea generar tus propios UUID para asegurarte de que nunca terminarás con documentos duplicados, pero definitivamente iré con UUID a menos que específicamente necesitar lo contrario. documenta.

4

Viniendo desde el punto de vista de una base de datos relacional, me tomó un tiempo para descubrir couchdb. Pero la verdad es lo opuesto a la respuesta de aceptación;

En lugar de utilizar un uuid predeterminado, generar una identificación inteligente puede ser de gran ayuda para recuperar y ordenar datos.

Supongamos que tiene una base de datos de películas. Todos los documentos se pueden encontrar en algún lugar debajo de la URL/películas, pero ¿dónde exactamente?

Si almacena un documento con _id Jabberwocky ({"_id": "Jabberwocky"}) en su base de datos de películas, estará disponible en la URL/películas/Jabberwocky. Entonces, si envía una solicitud GET a/movies/Jabberwocky, obtendrá el JSON que conforma su documento ({"_id": "Jabberwocky"}).

http://guide.couchdb.org/draft/documents.html

punta de rendimiento: si sólo está utilizando los identificadores de documentos generados aleatoriamente, entonces no sólo se está perdiendo en una oportunidad para obtener un índice libre - que está también incurrir en la sobrecarga de construir un índice que nunca usarás. ¡Así que use y abuse sus ID de documento!

https://pouchdb.com/2014/05/01/secondary-indexes-have-landed-in-pouchdb.html

Cuestiones relacionadas