Концепция семейства столбцов и модель данных

Я изучаю различные типы баз данных NoSQL и пытаюсь понять модель данных хранилищ столбцов, таких как Bigtable, HBase и Cassandra.

Первая модель

Некоторые люди описывают семейство столбцов как набор строк, где каждая строка содержит столбцы [1], [2]. Пример этой модели (семейства столбцов указаны в верхнем регистре):

{
  "USER":
  {
    "codinghorror": { "name": "Jeff", "blog": "http://codinghorror.com/" },
    "jonskeet": { "name": "Jon Skeet", "email": "[email protected]" }
  },
  "BOOKMARK":
  {
    "codinghorror":
    {
      "http://codinghorror.com/": "My awesome blog",
      "http://unicorns.com/": "Weaponized ponies"
    },
    "jonskeet":
    {
      "http://msmvps.com/blogs/jon_skeet/": "Coding Blog",
      "http://manning.com/skeet2/": "C# in Depth, Second Edition"
    }
  }
}

Вторая модель

Другие сайты описывают семейство столбцов как группу связанных столбцов в строке [3], [4]. Данные из предыдущего примера, смоделированные следующим образом:

{
  "codinghorror":
  {
    "USER": { "name": "Jeff", "blog": "http://codinghorror.com/" },
    "BOOKMARK":
    {
      "http://codinghorror.com/": "My awesome blog",
      "http://unicorns.com/": "Weaponized ponies"
    }
  },
  "jonskeet":
  {
    "USER": { "name": "Jon Skeet", "email": "[email protected]" },
    "BOOKMARK":
    {
      "http://msmvps.com/blogs/jon_skeet/": "Coding Blog",
      "http://manning.com/skeet2/": "C# in Depth, Second Edition"
    }
  }
}

Возможное объяснение первой модели заключается в том, что не все семейства столбцов имеют такое отношение, как USER и BOOKMARK. Это означает, что не все семейства столбцов содержат одинаковые ключи. С этой точки зрения размещение семейств столбцов на внешнем уровне кажется более естественным.

Название «семейство столбцов» подразумевает группу столбцов. Именно так семейства столбцов представлены во второй модели.

Обе модели являются допустимыми представлениями данных. Я понимаю, что эти представления предназначены исключительно для передачи данных людям; приложения не «думают» о данных таким образом.

Вопрос

Каково «стандартное» определение семейства столбцов? Это набор строк или группа связанных столбцов в строке?

Мне нужно написать статью на эту тему, поэтому меня также интересует, как люди обычно объясняют концепцию «семейства столбцов» другим людям. Обе эти модели кажутся противоречащими друг другу. Я хотел бы использовать «правильную» или общепринятую модель для описания хранилищ столбцов.


Обновлять

Я остановился на второй модели для объяснения модели данных в своей статье. Мне все еще интересно, как вы объясните другим людям модель данных хранилищ столбцов.


person Niels van der Rest    schedule 14.07.2010    source источник
comment
+1 отличный пост, я бы хотел прочитать вашу статью, если она доступна в Интернете (пожалуйста, обновите сообщение, если все в порядке).   -  person tbone    schedule 28.02.2013
comment
@tbone Спасибо! Статья недоступна в Интернете, но я могу преобразовать ее части в сообщения в блоге, если найду время.   -  person Niels van der Rest    schedule 01.03.2013


Ответы (3)


Я думаю, что база данных Cassandra следует вашей первой модели. ColumnFamily — это набор строк, который может содержать любые столбцы в разреженном виде (поэтому каждая строка может иметь разные наборы имен столбцов, если это необходимо). Количество столбцов, разрешенных в строке, почти не ограничено (2 миллиарда в Cassandra v0.7).

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

В Cassandra это важно, потому что данные в определенном семействе столбцов хранятся в одних и тех же файлах на диске, поэтому более эффективно размещать элементы данных, которые, вероятно, будут извлекаться вместе, в одном и том же семействе столбцов. Отчасти это связано с практической заботой о скорости, но также и с организацией ваших данных в четкую схему. Это касается вашего второго определения - можно считать, что все данные о конкретном ключе являются «строкой», но разделены семейством столбцов. Однако в Cassandra на самом деле это не одна строка, потому что данные в одном семействе столбцов могут быть изменены независимо от данных в других семействах столбцов для одного и того же ключа строки.

person DNA    schedule 13.04.2011
comment
Спасибо, что поделились своими мыслями по этому поводу! Я пришел к выводу, что в этом нет правильного или неправильного, и ваш ответ только подтверждает это. В основном это двух- (или трех)-мерная матрица, как традиционная таблица базы данных, но из-за разреженного характера содержимого она не поддается обычному табличному формату :) - person Niels van der Rest; 14.04.2011

Обе модели, которые вы описали, одинаковы.

Семейство столбцов:

Key -> Key -> (Set of key/value pairs)

Концептуально получается:

Table -> Row -> (Column1/Value1, Column2/Value2, ...)

Думайте об этом как о карте карт пар ключ/значение.

UserProfile = {
    Cassandra = [emailAddress:"[email protected]", age:20],
    TerryCho = [emailAddress:"[email protected]", gender:"male"],
    Cath = [emailAddress:"[email protected]", age:20, gender:"female", address:"Seoul"],
}

Выше приведен пример семейства столбцов. Если бы вы свели его в таблицу, вы бы получили таблицу с именем UserProfile, которая выглядит так:

UserName | Email | Age | Gender | Address
Cassandra | [email protected] | 20 | null | null
TerryCho | [email protected] | null | male | null
Cath | [email protected] | 20 | female | Seoul

Сбивает с толку то, что на самом деле это не столбец или строка, как мы привыкли думать о них. Есть куча «семейств столбцов», которые запрашиваются по имени (ключу). Эти семейства содержат множество наборов пар ключ/значение, которые также запрашиваются по имени (ключ строки), и, наконец, каждое значение в наборе можно искать также по имени (ключ столбца).

Если вам нужна табличная точка отсчета, «семейства столбцов» будут вашими «таблицами». Каждый «набор пар k/v» внутри них будет вашими «строками». Каждая «пара набора» будет «именами столбцов и их значениями».

Внутренне данные внутри каждого семейства столбцов будут храниться вместе, и они будут храниться таким образом, чтобы строки шли одна за другой, а в каждой строке столбцы шли друг за другом. Таким образом, вы получаете row1 -> col1/val1, col2/val2, ... , row2 -> col1/val1 ... , ... -> .... Таким образом, в этом смысле данные хранятся гораздо больше как хранилище строк, чем хранилище столбцов.

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

person Didier A.    schedule 21.01.2017

Насколько я понимаю, Cassandra ColumnFamily — это не набор строк, а кластер столбцов. Столбцы группируются вместе на основе ключа кластеризации. например, давайте рассмотрим ниже семейство столбцов:

CREATE TABLE store (
  enrollmentId int,
  roleId int,
  name text,
  age int,
  occupation text,
  resume blob,
  PRIMARY KEY ((enrollmentId, roleId), name)
) ;


INSERT INTO store (enrollmentid, roleid, name, age, occupation, resume)
values (10293483, 01, 'John Smith', 26, 'Teacher', 0x7b22494d4549);

Вставленные выше детали получены с помощью cassandra-cli, они довольно хорошо кластеризованы на основе ключа кластеризации, в этом примере «имя = Джон Смит» является ключом кластеризации.

RowKey: 10293483:1
=> (name=John Smith:, value=, timestamp=1415104618399000)
=> (name=John Smith:age, value=0000001a, timestamp=1415104618399000)
=> (name=John Smith:occupation, value=54656163686572, timestamp=1415104618399000)
=> (name=John Smith:resume, value=7b22494d4549, timestamp=1415104618399000)
person dwingle    schedule 04.11.2014