database design - Neo4j/Estrategia para mantener el historial de cambios de nodo
database-design graph (1)
Debes tener 2 tipos de nodos (con diferentes etiquetas): nodos de coches (como "Ferrari" en tu pregunta) y nodos CarVersion (como los nodos Vn). Solo los nodos de Auto deben contener el UUID. Todos los demás datos del automóvil deberían ir en los nodos CarVersion.
Además, para garantizar que los UUID sean únicos y para que obtener un nodo de automóvil específico sea más rápido, puede crear una restricción de exclusividad en la propiedad UUID de sus nodos de automóvil.
Supongamos un gráfico que trata de automóviles.
Cada Car
puede evolucionar con el tiempo, y necesito hacer un seguimiento de esos cambios.
(para poder rastrear algunas inconsistencias de evolución, etc.)
Pensé en implementar un mecanismo de copiado por escritura (como parece hacer LinkedIn ), lo que significa crear un nuevo nodo de Car
completo cada vez que cambie una de las propiedades del Car
.
Terminaría con un gráfico como este:
(Ferrari)-[:CURRENT]->(V3)-[:PREVIOUS]->(V2)-[:PREVIOUS]->(V1)
Estoy específicamente interesado en recuperar la versión más reciente, por lo que sonaría bien.
Sin embargo, ¿cómo lidiar con el UUID del Car
inicial?
El UUID de Mi Car
(que es una propiedad indexada para facilitar las consultas) se genera automáticamente a través de una biblioteca (Apache).
Imagino que si conservo el mismo UUID inicial para cada versión del Car
, esto podría ocasionar un conflicto: " Recupere el Ferrari
cuyo UUID es 123 " => devolviendo más de un resultado. 3 resultados si 3 versiones.
¿Es seguro y eficiente generar un nuevo UUID de marca para cada versión?
Por lo tanto, soy consciente de que, en este caso, la única forma de recuperar una versión en particular sería atravesar la parte correspondiente del gráfico hasta la correcta y sin contar con una consulta simple en el UUID inicial; eso todavía parece muy eficiente y fácil con una simple consulta Cypher.
Quiero mantener un UUID generado ya que no es aconsejable tener una URL REST potencial "adivinable" (usando el UUID del recurso).
De hecho, podría tener un UUID que sea la combinación entre el modelo de Car
y su versión, pero parece no ser lo suficientemente "seguro" con visibilidad en mis URL. Cualquier persona malintencionada podría fácilmente recuperar una versión anterior simplemente cambiando la URL.