Este team de especialistas luego de muchos días de investigación y de juntar de información, dimos con los datos necesarios, queremos que resulte de gran utilidad en tu plan.
Solución:
Déjame entender — si la pareja (userId, placeId)
debe ser único (lo que significa que no tiene que poner dos filas con este par de datos) ¿cuál es el timeVisit
útil para en la primaria key? ¿Por qué realizarías una consulta usando order by visitTime desc
si esto tendrá sólo una fila?
Si lo que necesitas es evitar duplicidades tienes 2 formas.
1 – Transacción ligera — esto, usando IF NOT EXISTS
hará lo que quieras. Pero como expliqué aquí, las transacciones ligeras son realmente lentas debido a un manejo particular por parte de Cassandra.
2 – USING TIMESTAMP
Cumplimiento del tiempo de escritura – (¡cuidado con eso!***) El ‘truco‘ es forzar una disminución TIMESTAMP
Déjame dar un ejemplo:
INSERT INTO users (uid, placeid , visittime , otherstuffs ) VALUES ( 1, 2, 1000, 'PLEASE DO NOT OVERWRITE ME') using TIMESTAMP 100;
Esto produce esta salida
select * from users;
uid | placeid | otherstuffs | visittime
-----+---------+----------------------------+-----------
1 | 2 | PLEASE DO NOT OVERWRITE ME | 1000
Ahora disminuyamos el timestamp
INSERT INTO users (uid, placeid , visittime , otherstuffs ) VALUES ( 1, 2, 2000, 'I WANT OVERWRITE YOU') using TIMESTAMP 90;
Ahora los datos de la tabla no se han actualizado.ya que existe una operación TS mayor (100) para la pareja (uid, placeid)
— de hecho aquí la salida no ha cambiado
select * from users;
uid | placeid | otherstuffs | visittime
-----+---------+----------------------------+-----------
1 | 2 | PLEASE DO NOT OVERWRITE ME | 1000
Si el rendimiento importa, use la solución 2, si el rendimiento no importa, use la solución 1. Para la solución 2, puede calcular una marca de tiempo decreciente para cada escritura usando un número fijo menos el tiempo del sistema en milisegundos.
p.ej:
Long decreasingTimestamp = 2_000_000_000_000L - System.currentTimeMillis();
*** esta solución puede provocar un comportamiento inesperado si, por ejemplo, desea eliminar y luego volver a insertar datos. Es importante saber que una vez que elimine los datos, podrá volver a escribirlos solo si la operación de escritura tendrá una marca de tiempo superior a la de eliminación (si no se especifica, la marca de tiempo utilizada es la de la máquina)
HH,
carlo
Si te gustó nuestro trabajo, tienes la habilidad dejar un post acerca de qué te ha parecido este enunciado.