sobre - La clave principal en cassandra es única?
investigaciones sobre netflix (5)
Indico específicamente que la clave de partición debe ser única. No puedo obtenerla en un solo lugar, sino en las siguientes declaraciones.
Cassandra necesita todas las columnas de clave de partición para poder calcular el hash que le permitirá ubicar los nodos que contienen la partición.
La clave de partición tiene un uso especial en Apache Cassandra además de mostrar la singularidad del registro en la base de datos.
Tenga en cuenta que no habrá ningún error si inserta la misma clave de partición una y otra vez, ya que no hay verificación de restricciones.
Las consultas en las que ejecutará búsquedas de igualdad deben estar en una clave de partición.
Referencias
https://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause
¿Cómo Cassandra elige el nodo coordinador y los nodos de replicación?
Podría ser un poco cojo pero en Cassandra tiene la clave principal para ser único. Por ejemplo en la siguiente tabla:
CREATE TABLE users (
name text,
surname text,
age int,
adress text,
PRIMARY KEY(name, surname)
);
Entonces, ¿es posible en mi base de datos tener 2 personas en mi base de datos con el mismo nombre y apellido pero con diferentes edades? Lo que significa la misma clave principal ..
La clave principal es única. Con su modelo de datos, solo puede tener una combinación de edad por (nombre, apellido).
Por definición, la clave principal tiene que ser única. Pero eso no significa que no puedas cumplir tus objetivos. Solo necesitas cambiar tu enfoque / terminología.
En primer lugar, si relaja su objetivo de que el nombre + apellido sea una clave principal, puede hacer lo siguiente:
CREATE TABLE users ( name text, surname text, age int, address text, PRIMARY KEY((name, surname),age) );
insert into users (name,surname,age,address) values (''name1'',''surname1'',10,''address1'');
insert into users (name,surname,age,address) values (''name1'',''surname1'',30,''address2'');
select * from users where name=''name1'' and surname=''surname1'';
name | surname | age | address
-------+----------+-----+----------
name1 | surname1 | 10 | address1
name1 | surname1 | 30 | address2
Si, por otro lado, desea asegurarse de que la dirección también se comparte, probablemente solo desee almacenar una colección de edades en el registro del usuario. Eso se podría lograr mediante:
CREATE TABLE users2 ( name text, surname text, age set<int>, address text, PRIMARY KEY(name, surname) );
insert into users2 (name,surname,age,address) values (''name1'',''surname1'',{10,30},''address2'');
select * from users2 where name=''name1'' and surname=''surname1'';
name | surname | address | age
-------+----------+----------+----------
name1 | surname1 | address2 | {10, 30}
Así que vuelve a lo que realmente necesitas lograr. Esperemos que los ejemplos anteriores le den algunas ideas.
Sí, como se mencionó en los comentarios anteriores, puede tener una clave compuesta con nombre, apellido y edad para lograr su objetivo, pero aún así, eso no resolverá el problema. Más bien, puede considerar agregar una nueva columna de ID de usuario y hacer que sea la clave principal. Por lo tanto, incluso en caso de que el nombre, el apellido y la edad estén duplicados, no es necesario volver a visitar su modelo de datos.
CREATE TABLE users (
userId int,
name text,
surname text,
age int,
adress text,
PRIMARY KEY(userid)
);
Sí, la clave principal tiene que ser única. De lo contrario, no habría forma de saber qué fila devolver cuando se consulta con una clave duplicada.
En su caso, puede tener 2 filas con el mismo nombre o con el mismo apellido pero no ambos.