Как представить 2-D матрицу данных в базе данных - PullRequest
36 голосов
/ 16 июля 2009

У меня есть набор данных, который состоит из идентификатора и матрицы (n x n) данных, связанных с этим идентификатором.

И имена столбцов (A, B, C, D) и имена строк (1,2,3) также важны и должны храниться для каждого отдельного идентификатора, а также данных (a1, b1, c1, d1, ...)

например:

ID | A | Б | C | D |

1 | a1 | б1 | с1 | d1 |

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

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

Я пытаюсь определить наилучший способ моделирования этого набора данных в базе данных, однако это кажется чем-то сложным, учитывая плоский характер СУБД.

Мне лучше держать идентификатор и блоб XML, представляющий матрицу данных, или я упускаю из виду более простое решение.

Спасибо.

Ответы [ 6 ]

31 голосов
/ 16 июля 2009

СУБД не плоские. Часть R следит за этим. Что вам нужно, это:

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

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

Entity:EntityData - это отношение один ко многим; каждая ячейка в матрице имеет строку EntityData.

Теперь у вас есть схема, которую можно анализировать на уровне SQL, вместо того, чтобы быть просто дампом данных, где вам нужно извлечь и извлечь все на уровне приложения, чтобы узнать что-нибудь об этом.

6 голосов
/ 16 июля 2009

Это одна из причин, почему PostgreSQL поддерживает массивы как тип данных. Смотри

Где это показано, вы можете использовать синтаксис, такой как ARRAY[[1,2,3],[4,5,6],[7,8,9]], чтобы определить значения матрицы 3x3 или val integer[3][3], чтобы объявить тип столбца матрицей 3x3.

Конечно, это совсем не стандартный SQL и специфичен для PostgreSQL. Другие базы данных могут иметь аналогичные, но немного отличающиеся реализации.

4 голосов
/ 16 июля 2009

Если вы хотите по-настоящему реляционное решение:

Matrix
------
id

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

Но ограничения, чтобы убедиться, что у вас есть действительные данные, были бы отвратительными.

Я бы рассматривал матрицу как отдельное значение в отношении БД и сохранял бы ее как CSV:

Matrix
------
id
cols
data

Что несколько легче XML.

1 голос
/ 16 июля 2009

Я бы, наверное, реализовал это так:

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

Если все, что вам нужно, это хранить данные, эта структура будет содержать матрицу любого размера и позволит вам восстановить любую матрицу из идентификатора. Вам потребуется некоторая постобработка, чтобы представить ее в «матричном формате», но для этого нужен код переднего плана.

0 голосов
/ 19 февраля 2011

Или, что еще лучше, вы можете создать логический массив, подобный структуре. Скажем, вы хотите сохранить массив m X n .. Создайте m атрибутов в таблице. В каждом атрибуте хранится n элементов, разделенных разделителями ...

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

0 голосов
/ 16 июля 2009

можно ли рассматривать данные как "данные строки"? если это так, то, возможно, вы могли бы сохранить каждую строку как объект (или блоб XML) с данными A, B, C, D, а затем в своем «представлении» вы используете что-то вроде LinkedHashMap (при условии Java) для получения объектов идентификационный ключ.

Кроме того, кажется, что по самой своей сути типичная таблица базы данных уже делает то, что вам нужно, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...