Концепция семейства столбцов и модель данных - PullRequest
20 голосов
/ 14 июля 2010

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

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

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

{
  "USER":
  {
    "codinghorror": { "name": "Jeff", "blog": "http://codinghorror.com/" },
    "jonskeet": { "name": "Jon Skeet", "email": "jskeet@site.com" }
  },
  "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": "jskeet@site.com" },
    "BOOKMARK":
    {
      "http://msmvps.com/blogs/jon_skeet/": "Coding Blog",
      "http://manning.com/skeet2/": "C# in Depth, Second Edition"
    }
  }
}

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

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

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

Вопрос

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

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


Обновление

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

Ответы [ 3 ]

10 голосов
/ 14 апреля 2011

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

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

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

6 голосов
/ 21 января 2017

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

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

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

Концептуально это становится:

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

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

UserProfile = {
    Cassandra = [emailAddress:"cassandra@apache.org", age:20],
    TerryCho = [emailAddress:"terry.cho@apache.org", gender:"male"],
    Cath = [emailAddress:"cath@apache.org", age:20, gender:"female", address:"Seoul"],
}

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

UserName | Email | Age | Gender | Address
Cassandra | cassandra@apache.org | 20 | null | null
TerryCho | terry.cho@apache.org | null | male | null
Cath | cath@apache.org | 20 | female | Seoul

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

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

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

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

2 голосов
/ 04 ноября 2014

Насколько я понимаю, 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, они довольно хорошо кластеризованы на основе ключа кластеризации, в этом примере "name = John Smith" - ключ кластеризации.

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)
...