Подтвердить что ты не робот

Как представить двумерную матрицу данных в базе данных

У меня есть набор данных, который состоит из 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-блок, представляющий матрицу данных, или я не вижу более простого решения здесь.

Спасибо.

4b9b3361

Ответ 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 элементов, разделенных разделителями...

при извлечении данных просто выполните обратный анализ, чтобы легко вернуть данные.