web-dev-qa-db-ja.com

データベースで2次元データマトリックスを表す方法

IDと、そのIDに関連するデータの行列(n x n)で構成されるデータセットがあります。

列名(A、B、C、D)と行名(1、2、3)も重要であり、データ(a1、b1、c1、d1)と同様に、個々のIDごとに保持する必要があります。 、...)

例えば:

ID | A | B | C | D |

1 | a1 | b1 | c1 | d1 |

2 | ... | ... | ... | ... |

3 | ... | ... | ... | ... |

このデータセットをデータベースでモデル化する最良の方法を決定しようとしていますが、RDBMSのフラットな性質を考えると難しいようです。

IDとデータマトリックスを表すXML Blobを保持するほうがよいのでしょうか、またはここでより簡単なソリューションを見落としているのでしょうか。

ありがとう。

37
miguel

RDBMSはフラットではありません。 R部はそれを見ています。必要なものは:

Table Entity
------------
ID

Table EntityData
----------------
EntityID
MatrixRow (1, 2, 3...)
MatrixColumn (A, B, C, D...)
Value

Entity:EntityDataは1対多の関係です。行列の各セルにはEntityData行があります。

これで、データレベルで分析するのではなく、SQLレベルで分析できるスキーマができました。スキーマについて何かを見つけるために、アプリケーションレベルですべてを引き出して抽出する必要があります。

33
chaos

これが、PostgreSQLがデータ型として配列をサポートする理由の1つです。見る

それが示す場所では、ARRAY[[1,2,3],[4,5,6],[7,8,9]]のような構文を使用して3x3マトリックスの値を定義したり、val integer[3][3]を使用して列タイプを3x3マトリックスとして宣言したりできます。

もちろん、これは標準SQLではなく、PostgreSQL固有です。他のデータベースには、似ているが少し異なる実装がある場合があります。

7
jdkoftinoff

真にリレーショナルなソリューションが必要な場合:

Matrix
------
id

Matrix_Cell
-----------
matrix_id
row
col
value

しかし、有効なデータがあることを確認するための制約は恐ろしいものになります。

私は、DBに関する限り、行列を単一の値と見なし、csvとして格納します。

Matrix
------
id
cols
data

これはXMLよりもやや軽量です。

4
Draemon

私はおそらくこれを次のように実装します:

Table MatrixData
----------------
id
rowName
columnName
datapoint

探しているのがデータの保存だけの場合、この構造は任意のサイズの行列を保持し、IDから任意の行列を再構成できます。 「マトリックス形式」で表示するには、いくつかの後処理が必要ですが、それがフロントエンドコードの目的です。

2
Lee

データは「行データ」と考えることができますか?もしそうなら、おそらく、各行をデータA、B、C、Dを持つオブジェクト(またはXML Blob)として格納し、「表現」でLinkedHashMap(Javaを想定)のようなものを使用してオブジェクトを取得できます。 IDキー。

また、典型的なデータベーステーブルは、その非常に基本的な性質上、すでに必要な機能を果たしているようです。

0
djangofan