Первичный ключ в cassandra уникален?

Это может быть немного неубедительно, но в Кассандре первичный ключ должен быть уникальным? Например, в следующей таблице:

CREATE TABLE users (
  name text,
  surname text,
  age int,
  adress text,
  PRIMARY KEY(name, surname)
);

Итак, возможно ли в моей базе данных иметь 2 человека с одинаковым именем и фамилией, но разного возраста? Что означает тот же первичный ключ.


person DarKAngeL    schedule 13.02.2014    source источник


Ответы (5)


Да, первичный ключ должен быть уникальным. В противном случае было бы невозможно узнать, какую строку следует вернуть при запросе с повторяющимся ключом.

В вашем случае у вас может быть 2 строки с одним и тем же именем или с одной и той же фамилией, но не с обоими.

person Daniel    schedule 13.02.2014
comment
ну... честно говоря, он мог бы вернуть оба значения, если бы были дубликаты :) - person Chip; 18.05.2016

По определению первичный ключ должен быть уникальным. Но это не значит, что вы не можете достичь своих целей. Вам просто нужно изменить свой подход/терминологию.

Прежде всего, если вы ослабите свою цель, чтобы имя + фамилия были первичным ключом, вы можете сделать следующее:

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

Если, с другой стороны, вы хотите убедиться, что адрес также является общим, то вы, вероятно, просто захотите сохранить набор возрастов в записи пользователя. Это может быть достигнуто за счет:

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}

Таким образом, все возвращается к тому, что вам действительно нужно выполнить. Надеемся, приведенные выше примеры натолкнут вас на некоторые идеи.

person Tupshin Harper    schedule 14.02.2014
comment
в чем разница между PRIMARY KEY((name, surname),age) и PRIMARY KEY(name, surname ,age) - person Prakash Pandey; 07.02.2017
comment
@PrakashPandey Это составные ключи. Как указано в предоставленной ссылке: Составной ключ раздела — это ключ раздела, состоящий из нескольких столбцов. Вы используете дополнительный набор круглых скобок, чтобы заключить столбцы, составляющие составной ключ секции. Столбцы в определении первичного ключа, но за пределами вложенных круглых скобок, являются столбцами кластеризации. Эти столбцы образуют логические наборы внутри раздела для облегчения поиска. - person mschuurmans; 31.07.2017

Первичный ключ уникален. С вашей моделью данных у вас может быть только один возраст для комбинации (имя, фамилия).

person Richard    schedule 13.02.2014

Да, как упоминалось в комментариях выше, у вас может быть составной ключ с именем, фамилией и возрастом для достижения вашей цели, но тем не менее это не решит проблему. Вместо этого вы можете рассмотреть возможность добавления нового идентификатора пользователя столбца и сделать его первичным ключом. Таким образом, даже в случае дублирования имени, фамилии и возраста вам не нужно пересматривать свою модель данных.

CREATE TABLE users (
  userId int,
  name text,
  surname text,
  age int,
  adress text,
  PRIMARY KEY(userid)
);
person Prabu Velusamy    schedule 23.10.2018

Я бы особо отметил, что ключ раздела должен быть уникальным. Я не мог получить его в одном месте, но из следующих утверждений.

  • Cassandra нужны все столбцы ключа раздела, чтобы иметь возможность вычислить хэш, который позволит найти узлы, содержащие раздел.

  • Ключ раздела используется в Apache Cassandra не только для демонстрации уникальности записи в базе данных.

  • Обратите внимание, что не будет никакой ошибки, если вы вставите один и тот же ключ раздела снова и снова, так как нет проверки ограничения.

  • Запросы, для которых вы будете выполнять поиск на равенство, должны находиться в ключе секции.

Рекомендации

https://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

как Cassandra выбирает узел-координатор и узлы репликации?< /а>

Запрос на вставку заменяет строки с одинаковым полем данных в столбце кластеризации Cassandra

person Alex Punnen    schedule 15.11.2018
comment
извините, но это неверно - ключ раздела не обязательно должен быть уникальным - если у вас уникальный ключ раздела, то у вас тонкие разделы, состоящие только из одной строки. Если у вас неуникальный ключ раздела, вам необходимо иметь столбцы кластеризации, чтобы они образовывали уникальный первичный ключ. Я видел клиентов, у которых был только один раздел с миллионами строк внутри (из-за ошибок модели данных). - person Alex Ott; 15.11.2018
comment
Спасибо, это немного запутанно. Но это не узел, обрабатывающий диапазон токенов, так что набор уникальных разделов сопоставляется с одним узлом и, таким образом, обрабатывает это. Пожалуйста, также перейдите по ссылкам, так как я цитировал большинство из них. Я сделал этот тест и проверил некоторое время назад, поэтому точно не помню - person Alex Punnen; 17.11.2018
comment
Вопрос был о первичном ключе, который идентифицирует отдельную строку в базе данных. Ключ раздела, используемый для вычисления маркера и выбора узла для хранения данных. Один раздел может содержать множество строк, каждая из которых идентифицируется собственным набором ключей кластеризации внутри раздела. - person Alex Ott; 17.11.2018