Ответ 1
В блоге Datastax есть хорошая запись в блоге об этом: http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows
Ответ: да, CQL3 поддерживает динамические колоны, а не то, как он работал в более ранних версиях CQL. Я не совсем понимаю ваш пример, вы смешиваете datestamps со строками, так что я не вижу, как это работает на CQL2. Если я правильно вас понимаю, вы хотите составить временную шкалу судовых наблюдений, где ключ раздела (строка строки) - это день, и каждое наблюдение представляет собой пару времени/имени. Вот предложение:
CREATE TABLE ship_sightings (
day TEXT,
time TIMESTAMP,
ship TEXT,
PRIMARY KEY (day, time)
)
И вы вставляете записи с
INSERT INTO ship_sightings (day, time, ship) VALUES ('Tuesday', NOW(), 'Titanic')
однако, скорее всего, вы должны использовать TIMEUUID
вместо TIMESTAMP
(и первичный ключ может быть DATE
), так как в противном случае вы можете добавить два наблюдения с одинаковой меткой времени и только один из них сохранится.
Это был пример широких строк, но тогда возникла проблема с динамическими столбцами, что не совсем одно и то же. Вот пример этого в CQL3:
CREATE TABLE ship_sightings_with_properties (
day TEXT,
time TIMEUUID,
ship TEXT,
property TEXT,
value TEXT,
PRIMARY KEY (day, time, ship, property)
)
который вы можете вставить следующим образом:
INSERT INTO ship_sightings_with_properties (day, time, ship, property, value)
VALUES ('Sunday', NOW(), 'Titanic', 'Color', 'Black')
# you need to repeat the INSERT INTO for each statement, multiple VALUES isn't
# supported, but I've not included them here to make this example shorter
VALUES ('Sunday', NOW(), 'Titanic', 'Captain', 'Edward John Smith')
VALUES ('Sunday', NOW(), 'Titanic', 'Status', 'Steaming on')
VALUES ('Monday', NOW(), 'Carapathia', 'Status', 'Saving the passengers off the Titanic')
Недостатком такого динамического столбца является то, что имена свойств будут храниться несколько раз (так что если у вас есть тысяча наблюдений в строке и у каждого есть свойство "Капитан", эта строка сохраняется тысячу раз), Сжатие на диске занимает большую часть этих накладных расходов, и большую часть времени ему не о чем беспокоиться.
Наконец, заметка о коллекциях на CQL3. Они являются полезной функцией, но они не способ реализовать широкие строки или динамические столбцы. Прежде всего, у них есть предел в 65536 пунктов, но Cassandra не может применять этот предел, поэтому, если вы добавите слишком много элементов, вы, возможно, не сможете их прочитать позже. Коллекции в основном предназначены для небольших полей с несколькими значениями. Канонический пример - это адресная книга, в которой каждая строка является записью и где записи имеют только одно имя, но несколько телефонных номеров, адреса электронной почты и т.д.