質問を解決するには、2つの方法があります。Cassandraなどの列データベース。または、リレーショナルの名前と値のペア(属性と値のペアとも呼ばれます)。
まず、Cassandraは構造化されたKey-Valueストアです。キーには、複数の変数の属性と値を含めることができます。値または列は、列ファミリーにグループ化されます。列ファミリーは、Cassandraデータベースが作成されるときに修正されます。ファミリは、論理データモデルのエンティティまたはリレーショナルのテーブルに類似しています。列はいつでもファミリに追加できます。これにより、列ファミリーのさまざまなインスタンスがさまざまな列を持つことができます。これが必要なことです。さらに、列は指定されたキーに割り当てられるため、キーが異なれば、特定のファミリの列の数も異なります。
名前と値のペアは、属性と値のペアとも呼ばれ、論理データモデリングおよびリレーショナルで作成できます。これは、3つの関連するエンティティまたはテーブルを使用して実行できます。
- 列ファミリーに類似したベースエンティティ(顧客など)。
- 属性とその特性(純資産額など)を説明する「タイプ」エンティティ。
- 「値」エンティティ。ベースエンティティのインスタンスに属性を割り当て、それに値を割り当てます。
「タイプ」エンティティは、タイプコードによって識別され、説明やその他のドメイン特性を含む単なるコードテーブルです。ドメインとは、データタイプ、長さ、意味、および測定単位を指します。コンテキスト外(つまり、割り当てられていない)の属性を記述します。例としては、右寄せされた小数点以下2桁の8桁の純資産額があり、その説明は「流動性と非流動性の金額を含む顧客の総財務価値を表す値」です。
「value」エンティティは、顧客IDと属性タイプコードによって識別される連想エンティティまたはテーブルであり、純資産額タイプに顧客を割り当て、「$2,000,000」などの値を与えるvalue属性を持っています。
ただし、リレーショナルの名前と値のペアでは、SQLでクエリを実行するのがやや難しく、通常はうまく機能しません。これは、「タイプ」エンティティと「値」エンティティを1つに非正規化することで対処できます。3つのテーブルを使用する代わりに、2つ(1対多)を使用します。実際、それは本質的にカサンドラがそれを行う方法です。列ファミリーは、完全にフラット化された属性と値のペアです。
これがお役に立てば幸いです。NOSQLを使用する場合は、Cassandraのようなものを使用します。リレーショナルを使用する場合は、タイプと値を非正規化します(つまり、1つにまとめます)。リレーショナルの利点は、すでに持っていることです。カサンドラの欠点は、あなたがそれを学ばなければならないということですが、それはあなたが望むことをするために作られています。