Это правильный шаблон для построения составного первичного ключа с использованием хранилищ с широкими столбцами?
HBase и Cassandra построены как широкие хранилища столбцов, используя понятия как строк, так и столбцов.
Строка состоит из ключа, аналогичного концепции первичного ключа в РСУБД, и значения, состоящего из нескольких столбцов
Представление может быть следующим:
*******| Key | Value
-------+------------+-------------+------------------------------------------
Colunms| | name | value
-------+------------+-------------+------------------------------------------
| a | title | "Building a python graphdb in one night"
| b | body | "You maybe already know that I am..."
| c | publishedat | "2015-08-23"
| d | name | database
| e | start | 1
| f | end | 2
... ... ...
| u | title | "key/value store key composition"
... ... ...
| x | title | "building a graphdb with HappyBase"
... ... ...
Правильно ли на уровне приложения создавать составные первичные ключи, позволяющие быстро выполнять итерации по расположенным рядом строкам.
Это может быть представлено следующим образом.
*******| Key | Value
-------+------------+-------------+------------------------------------------
Colunms| identifier | name | value
-------+------------+-------------+------------------------------------------
| 1 | title | "Building a python graphdb in one night"
| 1 | body | "You maybe already know that I am..."
| 1 | publishedat | "2015-08-23"
| 2 | name | database
| 3 | start | 1
| 3 | end | 2
... ... ...
| 4 | title | "key/value store key composition"
... ... ...
| 42 | title | "building a graphdb with HappyBase"
... ... ...
name
колонна переместилась из Value
к Key
а также Value
имеет имя одного столбца value
,
2 ответа
Составные ключи используются все время при разработке схем Cassandra.
В C* ключи разбиты на две части: ключ раздела и столбцы кластеризации.
Ключ раздела используется для хеширования данных для узлов в кластере. Раздел - это набор данных, который может содержать одну или несколько строк на основе столбцов кластеризации. Данные в пределах раздела являются локальными для узла и хранятся в отсортированном порядке с помощью ключей кластеризации, что обеспечивает быстрый и эффективный доступ к данным в разделе с поддержкой запросов диапазона для ключей кластеризации.
C* также допускает поля данных, которые не являются частью составного ключа и обычно не используются в запросах, если вы не создадите для них вторичный индекс.
Термин "широкий столбец" немного устарел для C*. В нынешнем представлении CQL данные рассматриваются в более традиционных терминах как строки в таблице, которые сгруппированы в эффективные для доступа к разделам.
Поэтому, чтобы ответить на ваш вопрос, да, в C* обычно перемещают столбцы, которые в СУБД могут рассматриваться как столбцы данных, в составной ключ в C*.
Чтобы узнать больше информации о ключах разделов и столбцах кластеризации, а также о том, как они влияют на типы запросов, которые вы можете выполнять, посмотрите более подробно на предложение CQL WHERE.
Составные ключи очень популярны в дизайне схемы HBase. Они также позволяют выполнять быстрое сканирование префиксного компонента Rowkey. В отличие от Cassandra, RowKey не разбивается на части при хранении данных.
Простой пример: http://riteshadval.blogspot.com/2012/03/hbase-composite-row-key-design-doing.html
В HBase, в вашем примере, вы сможете сделать range scans with identifier only and with identifier+name also
,