Вставки строк, имеющие одинаковый первичный ключ, заменяют предыдущие записи в Cassandra
создал таблицу в Cassandra, где первичный ключ основан на двух столбцах(имя группы,тип). Когда я пытаюсь вставить более 1 строки, где groupname и type одинаковы, то в такой ситуации его не хранить более одной строки, последующие записи, где в groupname и type одинаковы.. затем последняя запись заменяет предыдущие аналогичные записи. Почему Кассандра заменяет таким образом вместо записи каждой строки im вставки?
пишите 1
cqlsh:resto> insert into restmaster (rest_id,type,rname,groupname,address,city,country)values(blobAsUuid(timeuuidAsBlob(now())),'SportsBar','SportsDen','VK Group','Majestic','Bangalore','India');
написать 2
insert into restmaster (rest_id,type,rname,groupname,address,city,country)values(blobAsUuid(timeuuidAsBlob(now())),'SportsBar','Sports Spot','VK Group','Bandra','Mumbai','India');
написать 3
cqlsh:resto> insert into restmaster (rest_id,type,rname,groupname,address,city,country)values(blobAsUuid(timeuuidAsBlob(now())),'SportsBar','Cricket Heaven ','VK Group','Connaught Place','New Delhi','India');
результат, который я ожидаю (проверьте строки 4,5,6)
groupname | type | rname
----------------+------------+-----------------
none | Udipi | Gayatri Bhavan
none | dinein | Blue Diamond
VK Group | FoodCourt | FoodLion
VK Group | SportsBar | Sports Den
VK Group | SportsBar | Sports Spot
VK Group | SportsBar | Cricket Heaven
Viceroy Group | Vegetarian | Palace Heights
Mainland Group | Chinese | MainLand China
JSP Group | FoodCourt | Nautanki
Ohris | FoodCourt | Ohris
но это фактический результат (запись 3 заменила предыдущие 2 вставки [строки 4,5])
cqlsh:resto> select groupname,type,rname From restmaster;
groupname | type | rname
----------------+------------+-----------------
none | Udipi | Gayatri Bhavan
none | dinein | Blue Diamond
VK Group | FoodCourt | FoodLion
VK Group | SportsBar | Cricket Heaven
Viceroy Group | Vegetarian | Palace Heights
Mainland Group | Chinese | MainLand China
JSP Group | FoodCourt | Nautanki
Ohris | FoodCourt | Ohris
cqlsh:resto> describe table restmaster;
CREATE TABLE restmaster (
groupname text,
type text,
address text,
city text,
country text,
rest_id uuid,
rname text,
PRIMARY KEY ((groupname), type)
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.100000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.000000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
1 ответов
все вставки в базу данных Cassandra фактически являются операциями вставки/обновления, и может быть только набор неключевых значений для однозначно определенного первичного ключа. Это означает, что у вас никогда не может быть более одного набора значений для одного первичного ключа и что вы увидите только последнюю запись.
Подробнее: http://www.datastax.com/documentation/cql/3.1/cql/cql_intro_c.html
обновление: datamodel
Если вы использовали ключ как
Primary Key ((groupname),type,rname)
пока у вас есть уникальные названия ресторанов, вы сможете получить ожидаемые результаты. Но на самом деле вы должны спросить: "какие запросы я хотел бы выполнить для этих данных?"Все таблицы Cassandra должны быть основаны на удовлетворении класса запросов. Ключ, который я написал выше, в основном говорит: "эта таблица построена, чтобы быстро найти все рестораны в определенной группе, и единственные условия, которые я буду использовать, будут по типу и по ресторану имя"
примеры запросов, которые вы могли бы выполнить с этой схемой
SELECT * FROM restmaster WHERE groupname = 'Lettuce Entertain You' ;
SELECT * FROM restmaster WHERE groupname = 'Lettuce Entertain You' and type = 'Formal' ;
SELECT * FROM restmaster WHERE groupname = 'Lettuce Entertain You' and type = 'Formal'
and rname > 'C' and rname < 'Y' ;
Если это не тот тип запросов, которые вы хотите выполнять в своем приложении, или вы хотите, чтобы другие запросы в дополнение к ним, вам, скорее всего, понадобятся дополнительные таблицы.