26

私はさまざまな種類の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"
    }
  }
}

2番目のモデル

他のサイトでは、列ファミリーを行内の関連する列のグループとして説明しています [ 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です。これは、すべての列ファミリーに同一のキーが含まれているわけではないことを意味します。カラムファミリーを外側のレベルに配置することは、この観点からより自然に感じます。

「列ファミリー」という名前は、列のグループを意味します。これはまさに、 2番目のモデルで列ファミリーが表示される方法です。

どちらのモデルもデータの有効な表現です。私は、これらの表現が人間に向けてデータを伝達するためだけのものであることを理解しています。アプリケーションは、そのような方法でデータを「考え」ません。

質問

列ファミリーの「標準」定義とは何ですか?それは行のコレクションですか、それとも行内の関連する列のグループですか?

私はこのテーマについて論文を書かなければならないので、人々が通常「コラムファミリー」の概念を他の人々にどのように説明するかにも興味があります。これらのモデルは両方とも互いに矛盾しているようです。コラムファミリーストアを説明するために、「正しい」または一般的に受け入れられているモデルを使用したいと思います。


アップデート

私の論文でデータモデルを説明するために、2番目のモデルに落ち着きました。コラムファミリーストアのデータモデルを他の人にどのように説明するについては、まだ興味があります。

4

3 に答える 3

16

Cassandraデータベースは最初のモデルに従っていると思います。ColumnFamilyは行のコレクションであり、スパースな方法で任意の列を含めることができます(したがって、必要に応じて、各行に異なる列名のコレクションを含めることができます)。1行に許可される列の数はほぼ無制限です(Cassandra v0.7では20億)。

重要な点は、行キーは定義上、列ファミリー内で一意である必要があるということですが、他の列ファミリーで再利用できます。したがって、同じキーに関する無関係のデータを異なるColumnFamiliesに保存できます。

Cassandraでは、特定の列ファミリーのデータがディスク上の同じファイルに保存されるため、これが重要になります。したがって、一緒に取得される可能性のあるデータ項目を同じColumnFamilyに配置する方が効率的です。これは部分的には実用的な速度の問題ですが、データを明確なスキーマに編成することの問題でもあります。これは、2番目の定義に触れます。特定のキーに関するすべてのデータを「行」と見なすことができますが、列ファミリーによって分割されます。ただし、Cassandraでは、1つのColumnFamilyのデータは、同じ行キーの他のColumnFamiliesのデータとは独立して変更できるため、実際には単一の行ではありません。

于 2011-04-13T22:52:35.847 に答える
10

あなたが説明した両方のモデルは同じです。

列ファミリーは次のとおりです。

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 ... , ... -> ...。その意味で、データは行ストアのように格納され、列ストアのようには格納されません。

最後に、ここでの単語の選択は、残念で誤解を招くだけです。列ファミリの列は、属性と呼ばれる必要があります。行は属性セットと呼ばれるべきでした。列ファミリーは属性ファミリーと呼ばれるべきでした。古典的な表形式の語彙との関係は、実際にはかなり異なるため、弱く誤解を招く可能性があります。

于 2017-01-21T07:33:09.773 に答える
2

私の理解によると、Cassandra ColumnFamilyは行のコレクションではなく、列のクラスターです。列は、クラスタリングキーに基づいて一緒にクラスタリングされます。たとえば、以下の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=JohnSmith」がクラスタリングキーです。

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)
于 2014-11-04T12:44:03.997 に答える