Първичният ключ в cassandra е уникален?

Може да е малко куцо, но в 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

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