Как представить двумерную матрицу данных в базе данных
У меня есть набор данных, который состоит из ID и матрицы (n x n) данных, связанных с этим идентификатором.
Оба названия столбцов (A, B, C, D) и имена строк (1,2,3) также важны и должны храниться для каждого отдельного идентификатора, а также данных (a1, b1, c1, d1,...)
например:
ID | A | B | C | D |
1 | a1 | b1 | c1 | d1 |
2 |... |... |... |... |
3 |... |... |... |... |
Я пытаюсь определить лучший способ моделирования этого набора данных в базе данных, однако, это похоже на то, что трудно, учитывая плоский характер РСУБД.
Мне лучше держать идентификатор и XML-блок, представляющий матрицу данных, или я не вижу более простого решения здесь.
Спасибо.
Ответы
Ответ 1
RDBMSes не являются плоскими. Часть R видит это. Что вам нужно:
Table Entity
------------
ID
Table EntityData
----------------
EntityID
MatrixRow (1, 2, 3...)
MatrixColumn (A, B, C, D...)
Value
Entity:EntityData
- отношение "один ко многим"; каждая ячейка в матрице имеет строку EntityData.
Теперь у вас есть схема, которая может быть проанализирована на уровне SQL, вместо того, чтобы просто быть дампом данных, где вам нужно вытащить и извлечь все на уровне приложения, чтобы узнать что-нибудь об этом.
Ответ 2
Если вы хотите действительно реляционное решение:
Matrix
------
id
Matrix_Cell
-----------
matrix_id
row
col
value
Но ограничения, чтобы убедиться, что у вас есть достоверные данные, будут отвратительными.
Я рассматривал бы матрицу как единственное значение в отношении БД и сохранял ее как
CSV:
Matrix
------
id
cols
data
Это немного легче XML.
Ответ 3
Это одна из причин, почему PostgreSQL поддерживает массивы как тип данных. См.
В этом случае вы можете использовать синтаксис типа ARRAY[[1,2,3],[4,5,6],[7,8,9]]
для определения значений матрицы 3x3 или val integer[3][3]
, чтобы объявить тип столбца как матрицу 3x3.
Конечно, это вовсе не стандартный SQL и специфичен для PostgreSQL. Другие базы данных могут иметь похожие, но немного отличающиеся реализации.
Ответ 4
Я бы, вероятно, реализовал его следующим образом:
Table MatrixData
----------------
id
rowName
columnName
datapoint
Если все, что вы ищете, это хранение данных, эта структура будет содержать матрицу любого размера и позволит вам восстановить любую матрицу из идентификатора. Вам понадобится некоторая пост-обработка, чтобы представить ее в "матричном формате", но это то, для чего используется внешний интерфейс.
Ответ 5
Можно ли рассматривать данные как "данные строки"? если да, то возможно, вы можете хранить каждую строку как объект (или XML-блок) с данными A, B, C, D, а затем в своем "представлении" вы используете что-то вроде LinkedHashMap (предполагая Java) для получения объектов с ключ ID.
Кроме того, похоже, что по самой своей сути типичная таблица базы данных уже делает то, что вам нужно, не так ли?
Ответ 6
Или даже лучше, что вы можете сделать, создать логический массив, такой как структура.
Скажем, вы хотите хранить массив m X n.
Создайте m атрибутов в таблице.
В каждом атрибуте хранится n элементов, разделенных разделителями...
при извлечении данных просто выполните обратный анализ, чтобы легко вернуть данные.