¿Diferencia entre clave de partición, clave compuesta y clave de agrupación en Cassandra?

523

He estado leyendo artículos en la red para comprender las diferencias entre los siguientes keytipos. Pero me parece difícil de entender. Los ejemplos definitivamente ayudarán a mejorar la comprensión.

primary key,
partition key, 
composite key 
clustering key
tormenta cerebral
fuente
23
Encontré este artículo que contiene muchas explicaciones detalladas sobre estos conceptos.
mynkow
Este artículo también señala claramente estos términos.
duong_dajgja
@duong_dajgja La URL que compartió anteriormente está rota, ¿puede editar el comentario con una URL válida / útil?
realPK
@realPK El enlace de alguna manera se ha ido. Pero encontré otro enlace para ti aquí quora.com/… .
duong_dajgja

Respuestas:

1172

Hay mucha confusión en torno a esto, intentaré hacerlo lo más simple posible.

La clave primaria es un concepto general para indicar una o más columnas utilizadas para recuperar datos de una tabla.

La clave principal puede ser SIMPLE e incluso declarada en línea:

 create table stackoverflow_simple (
      key text PRIMARY KEY,
      data text      
  );

Eso significa que está hecho por una sola columna.

Pero la clave primaria también puede ser COMPUESTO (también conocido como COMPUESTO ), generado a partir de varias columnas.

 create table stackoverflow_composite (
      key_part_one text,
      key_part_two int,
      data text,
      PRIMARY KEY(key_part_one, key_part_two)      
  );

En una situación de COMPOSITE clave principal, la "primera parte" de la tecla que se denomina clave de partición (en este ejemplo key_part_one es la clave de partición) y la segunda parte de la clave es la clave de agrupación (en este ejemplo key_part_two )

Tenga en cuenta que tanto la clave de partición como la agrupación en clúster se pueden hacer con más columnas , así es como:

 create table stackoverflow_multiple (
      k_part_one text,
      k_part_two int,
      k_clust_one text,
      k_clust_two int,
      k_clust_three uuid,
      data text,
      PRIMARY KEY((k_part_one, k_part_two), k_clust_one, k_clust_two, k_clust_three)      
  );

Detrás de estos nombres ...

  • La clave de partición es responsable de la distribución de datos entre sus nodos.
  • La clave de agrupación es responsable de la clasificación de datos dentro de la partición.
  • La clave primaria es equivalente a la clave de partición en una tabla de clave de campo único (es decir, simple ).
  • La clave compuesta / compuesta es cualquier clave de varias columnas

Información de uso adicional: DOCUMENTACIÓN DE DATASTAX


Uso pequeño y ejemplos de contenido CLAVE
SIMPLE :

insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';

contenido de la tabla

key | data
----+------
han | solo

COMPOSITE / COMPOUND KEY puede recuperar "filas anchas" (es decir, puede consultar solo con la clave de partición, incluso si tiene claves de agrupación definidas)

insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player');
select * from stackoverflow_composite where key_part_one = 'ronaldo';

contenido de la tabla

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |            9 |    football player
      ronaldo |           10 | ex-football player

Pero puede consultar con todas las claves (partición y agrupación) ...

select * from stackoverflow_composite 
   where key_part_one = 'ronaldo' and key_part_two  = 10;

salida de consulta

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |           10 | ex-football player

Nota importante: la clave de partición es el especificador mínimo necesario para realizar una consulta usando a where clause. Si tiene una clave de partición compuesta, como la siguiente

p.ej: PRIMARY KEY((col1, col2), col10, col4))

Puede realizar consultas solo pasando al menos col1 y col2, estas son las 2 columnas que definen la clave de partición. La regla "general" para realizar una consulta es que debe pasar al menos todas las columnas de claves de partición, luego puede agregar opcionalmente cada clave de agrupación en el orden en que se establecen.

entonces las consultas válidas son ( excluyendo índices secundarios )

  • col1 y col2
  • col1 y col2 y col10
  • col1 y col2 y col10 y col 4

Inválido:

  • col1 y col2 y col4
  • cualquier cosa que no contenga tanto col1 como col2

Espero que esto ayude.

Carlo Bertuccini
fuente
77
Como escribí: << La regla "general" para hacer una consulta es que debe pasar al menos todas las columnas de la clave de partición, luego puede agregar cada clave en el orden en que están configuradas. >> - ya que col10 se define antes col4 tienes que pasarlo para consultar también para col4
Carlo Bertuccini
2
Puede agregar índices secundarios, pero eso no significa que pueda ejecutar "cualquier" consulta cql, y más: antes de crear un índice secundario, debe contar hasta 10 ... 000 ..... :)
Carlo Bertuccini
2
Los índices secundarios se implementan como índices locales; no se distribuyen en el clúster. Cada nodo del clúster es responsable de almacenar índices secundarios de datos que posee. Por esta razón, una consulta en sec.index podría involucrar a todos los nodos en el clúster
Carlo Bertuccini
55
Esto me confundió durante unos días, gracias por esta respuesta, ahora puedo construir el modelo de datos en mi cabeza.
Roger Dwan el
2
Guau. me acabas de salvar horas o días! Gracias, brillante explicación.
Andre Garcia
128

Agregar una respuesta resumida como la aceptada es bastante larga. Los términos "fila" y "columna" se usan en el contexto de CQL, no cómo se implementa realmente Cassandra.

  • Una clave primaria identifica de forma exclusiva una fila.
  • Una clave compuesta es una clave formada por múltiples columnas.
  • Una clave de partición es la búsqueda principal para encontrar un conjunto de filas, es decir, una partición.
  • Una clave de agrupación es la parte de la clave primaria que no es la clave de partición (y define el orden dentro de una partición).

Ejemplos:

  • PRIMARY KEY (a): La clave de partición es a .
  • PRIMARY KEY (a, b): La clave de partición es a, la clave de agrupación esb .
  • PRIMARY KEY ((a, b)): La clave de partición compuesta es (a, b) .
  • PRIMARY KEY (a, b, c): La clave de partición es a, la clave de agrupación compuesta es(b, c) .
  • PRIMARY KEY ((a, b), c): La clave de partición compuesta es (a, b), la clave de agrupación es c.
  • PRIMARY KEY ((a, b), c, d): La clave de partición compuesta es (a, b), la clave de agrupación compuesta es (c, d).
OrangeDog
fuente
15

En cassandra, la diferencia entre la clave primaria, la clave de partición, la clave compuesta, la clave de agrupamiento siempre genera cierta confusión. Así que voy a explicar a continuación y relacionarme entre sí. Utilizamos CQL (lenguaje de consulta de Cassandra) para acceder a la base de datos de Cassandra. Nota: - La respuesta es según la versión actualizada de Cassandra. Clave primaria :-

En cassandra hay 2 formas diferentes de usar la clave primaria.

CREATE TABLE Cass (
    id int PRIMARY KEY,
    name text 
);

Create Table Cass (
   id int,
   name text,
   PRIMARY KEY(id) 
);

En CQL, el orden en que se definen las columnas para la CLAVE PRIMARIA es importante. La primera columna de la clave se llama clave de partición que tiene la propiedad de que todas las filas que comparten la misma clave de partición (incluso en la tabla de hecho) se almacenan en el mismo nodo físico. Además, la inserción / actualización / eliminación en filas que comparten la misma clave de partición para una tabla dada se realizan atómicamente y de forma aislada. Tenga en cuenta que es posible tener una clave de partición compuesta, es decir, una clave de partición formada por varias columnas, utilizando un conjunto adicional de paréntesis para definir qué columnas forman la clave de partición.

Particionamiento y agrupamiento La definición de CLAVE PRIMARIA se compone de dos partes: la Clave de partición y las Columnas de agrupamiento. La primera parte se asigna a la clave de fila del motor de almacenamiento, mientras que la segunda se usa para agrupar columnas en una fila.

CREATE TABLE device_check (
  device_id   int,
  checked_at  timestamp,
  is_power    boolean,
  is_locked   boolean,
  PRIMARY KEY (device_id, checked_at)
);

Aquí device_id es la clave de partición y check_at es cluster_key.

Podemos tener varias claves de clúster, así como también la clave de partición, que depende de la declaración.

Big Data Guy
fuente
66
Podría haber dado algo de crédito a sus fuentes (2013 = anterior a su publicación): thelastpickle.com/blog/2013/01/11/primary-keys-in-cql.html
Christophe Roussy
11

Clave primaria : se compone de clave (s) de partición [y claves (o columnas) de agrupamiento opcionales)
Clave de partición : el valor hash de la clave de partición se utiliza para determinar el nodo específico en un clúster para almacenar los datos
Clave de agrupación : se utiliza para ordenar los datos en cada una de las particiones (o nodo responsable y sus réplicas)

Clave primaria compuesta : como se dijo anteriormente, las claves de agrupación son opcionales en una clave primaria. Si no se mencionan, es una clave primaria simple. Si se mencionan las claves de agrupación, es una clave primaria compuesta.

Clave de partición compuesta : el uso de una sola columna como clave de partición puede generar problemas de fila amplia (depende del modelo de caso de uso / datos). Por lo tanto, la clave de partición a veces se especifica como una combinación de más de una columna.

Con respecto a la confusión de cuál es obligatorio , cuál se puede omitir, etc. en una consulta, tratar de imaginar a Cassandra como un HashMap gigante ayuda. Entonces, en un HashMap, no puede recuperar los valores sin la Clave.
Aquí, las teclas de partición juegan el papel de esa tecla. Por lo tanto, cada consulta debe tenerlos especificados. Sin el cual Cassandra no sabrá qué nodo buscar.
Las claves de agrupamiento (columnas, que son opcionales) ayudan a reducir aún más su búsqueda de consultas después de que Cassandra descubre el nodo específico (y sus réplicas) responsables de esa clave de Partición específica.

Chandan Hegde
fuente
5

En breve sentido:

Partition Key no es más que la identificación de una fila, esa identificación la mayoría de las veces es la columna única (llamada Primary Key ), a veces una combinación de varias columnas (llamada Composite Partition Key ).

La clave de clúster no es más que indexación y clasificación . Las claves de clúster dependen de algunas cosas:

  1. Qué columnas usa en la cláusula where, excepto las columnas de clave principal.

  2. Si tiene registros muy grandes, entonces, sobre qué preocupación puedo dividir la fecha para una administración fácil. Ejemplo, tengo datos de 1 millón de registros de población del condado. Entonces, para una administración fácil, agrupo los datos según el estado y después del código PIN, etc.

Dom
fuente
3
Partition Key NO es una identificación para una fila ... identifica un grupo de filas que tienen la misma clave de partición
wmac
1

Vale la pena señalar que probablemente usará esos lotes más que en conceptos similares en el mundo relacional (claves compuestas).

Ejemplo: suponga que tiene que encontrar los últimos N usuarios que recientemente se unieron al grupo de usuarios X. ¿Cómo haría esto de manera eficiente dado que las lecturas son predominantes en este caso? Así (de la guía oficial de Cassandra ):

CREATE TABLE group_join_dates (
    groupname text,
    joined timeuuid,
    join_date text,
    username text,
    email text,
    age int,
    PRIMARY KEY ((groupname, join_date), joined)
) WITH CLUSTERING ORDER BY (joined DESC)

Aquí, la clave de partición está compuesta y la clave de agrupación es una fecha unida. La razón por la cual una clave de agrupación es una fecha de unión es que los resultados ya están ordenados (y almacenados, lo que agiliza las búsquedas). Pero, ¿por qué usamos una clave compuesta para particionar la clave ? Porque siempre queremos leer la menor cantidad de particiones posible . ¿Cómo ayuda a join_date allí? ¡Ahora los usuarios del mismo grupo y la misma fecha de unión residirán en una sola partición! Esto significa que siempre leeremos la menor cantidad posible de particiones (primero comience con la más nueva, luego pase a la más antigua y así sucesivamente, en lugar de saltar entre ellas).

De hecho, en casos extremos, también necesitaría usar el hash de un join_date en lugar de un join_date solo, de modo que si consulta durante los últimos 3 días a menudo, esos comparten el mismo hash y, por lo tanto, están disponibles desde la misma partición.

kboom
fuente
0

La clave principal en Cassandra generalmente consta de dos partes: clave de partición y columnas de agrupamiento.

primary_key ((division_key), clustering_col)

Clave de partición: la primera parte de la clave primaria. El objetivo principal de una clave de partición es identificar el nodo que almacena la fila particular.

CREATE TABLE phone_book (phone_num int, name text, age int, city text, PRIMARY KEY ((phone_num, name), age);

Aquí, (phone_num, name) es la clave de partición. Al insertar los datos, se genera el valor hash de la clave de partición y este valor decide en qué nodo debe ir la fila.

Considere un clúster de 4 nodos, cada nodo tiene un rango de valores hash que puede almacenar. (Escribir) INSERTAR EN LOS VALORES de la guía telefónica (7826573732, 'Joey', 25, 'Nueva York');

Ahora, el valor hash de la clave de partición es calculado por el particionador Cassandra. digamos, valor hash (7826573732, 'Joey') → 12, ahora, esta fila se insertará en el Nodo C.

(Leer) SELECCIONAR * DESDE phone_book WHERE phone_num = 7826573732 y name = 'Joey';

Ahora, nuevamente se calcula el valor hash de la clave de partición (7826573732, 'Joey'), que es 12 en nuestro caso que reside en el Nodo C, desde el cual se realiza la lectura.

  1. Agrupación de columnas: segunda parte de la clave primaria. El objetivo principal de tener columnas de agrupación es almacenar los datos en un orden ordenado. Por defecto, el orden es ascendente.

Puede haber más de una clave de partición y columnas de agrupación en una clave primaria, dependiendo de la consulta que esté resolviendo.

primary_key ((pk1, pk2), col 1, col2)

Sumon Saikan
fuente
-3

En el diseño de bases de datos, una clave compuesta es un conjunto de superclaves que no es mínimo.

Una clave compuesta es un conjunto que contiene una clave compuesta y al menos un atributo que no es una superclave

Tabla dada: EMPLEADOS {employee_id, nombre, apellido}

Las posibles superclaves son:

{employee_id}
{employee_id, firstname}
{employee_id, firstname, surname}

{employee_id} es la única superclave mínima, que también la convierte en la única clave candidata, dado que {nombre} y {apellido} no garantizan la unicidad. Dado que una clave primaria se define como una clave candidata elegida, y solo existe una clave candidata en este ejemplo, {employee_id} es la superclave mínima, la única clave candidata y la única clave primaria posible.

La lista exhaustiva de claves compuestas es:

{employee_id, firstname}
{employee_id, surname}
{employee_id, firstname, surname}

La única clave compuesta es {employee_id, firstname, apellido} ya que esa clave contiene una clave compuesta ({employee_id, firstname}) y un atributo que no es una superclave ({apellido}).

Khurana
fuente
Totalmente irrelevante para la pregunta formulada. Edite la respuesta a las claves de dirección solicitadas en el contexto de Cassandra, no una explicación genérica. TY.
realPK