Хранение массивов в базах данных - PullRequest
11 голосов
/ 18 октября 2008

Каков наиболее эффективный способ хранения больших массивов (10000x100) в базе данных, скажем, hsqldb? Мне нужно сделать это для определенной математической программы, которую я пишу на языке Java. Пожалуйста помоги. Весь массив будет часто извлекаться и храниться (не так много отдельных элементов). Кроме того, некоторые метаданные о массиве должны быть сохранены о массиве.

Ответы [ 11 ]

15 голосов
/ 18 октября 2008

Отличный вопрос.

Если вы не хотите преобразовывать свои массивы в набор нормализованных таблиц, что, как вам кажется, не подходит, вы можете рассмотреть возможность сериализации.

Сериализация - это модное слово для превращения объектов в какой-то формат, который вы можете сохранить на диск или в базу данных. Два основных формата для сериализации - двоичный и XML, и я держу пари, что Java имеет некоторую поддержку для этого.

В зависимости от того, какие типы данных вы используете, вы сможете превратить ваш массив в XML или двоичный файл, а затем сохранить его в одном поле в базе данных. Вы можете начать работать с этой техникой в ​​Java, проверив http://java.sun.com/developer/technicalArticles/Programming/serialization/. Я знаю, что она встроена в .NET.

Надеюсь, это поможет. Дайте мне знать, если я могу дать вам больше указаний.

8 голосов
/ 18 октября 2008

Как насчет хранения данных в виде BLOB и использования Java для декодирования BLOB в реальный массив Java? Это было бы намного эффективнее для хранения и извлечения всего массива одним глотком, но было бы ужасно для перемешивания отдельных элементов.

2 голосов
/ 18 октября 2008

Придумайте внутреннее представление - будь то XML, JSON, какой-нибудь двоичный файл, который вы создадите сами, или любую другую форму сериализации.

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

Я категорически не согласен с тем, что способ сделать это - создать таблицу с тем же числом строк и столбцов, что и у вашей матрицы - это очень высокая цена за функциональность, которой вы не пользуетесь.

Заранее подготовьте операторы вставки / выбора и используйте переменные связывания, чтобы изменить матрицу, с которой вы работаете - не заставляйте db повторять каждый запрос.

1 голос
/ 18 октября 2008

Если ваши данные плотно упакованы (гистограмма значений близка к плоской линии), ваш лучший выбор - это блоб и сериализация с использованием потока объектов [Вывод / ввод].

В противном случае может оказаться более эффективным использование разреженных массивов и вариаций схемы Entity-Attribute-Value. Вот пример:

 Name | IndexKey  | Value
------+-----------+-------
 foo  | 'default' | 39        
 foo  | 0:0:0     | 23
 foo  | 0:0:1     | 34
 foo  | 1:5:0     | 12
 ...
 bar  | 1:3:8     | 20
 bar  | 1:3:8     | 23
 bar  | 1:1:1     | 24
 bar  | 3:0:6     | 54
 ...

Это также позволяет быстро обновлять части таблицы и выбирать фрагменты с помощью оператора SQL «like».

Если число ваших измерений фиксировано, чтобы разбить ключевой столбец на отдельные столбцы int для каждого измерения, чтобы повысить эффективность индекса и иметь более гибкие критерии выбора (вы можете использовать первый индекс 'null' для метаданных, таких как значение по умолчанию).

В любом случае рекомендуется создать кластерный индекс для столбцов Name, IndexKey.

1 голос
/ 18 октября 2008

Как уже предлагалось: не используйте СУБД, если вам не нужны функции. Вместо сериализации вы можете использовать низкоуровневый API, например JDBM , который предоставляет некоторые функции, подобные базам данных, например управление индексом на диске.

1 голос
/ 18 октября 2008

Если это только 1 массив, почему бы не использовать двоичный файл?

0 голосов
/ 03 июля 2010

HSQLDB 2.0 поддерживает одномерные массивы, хранящиеся в виде столбца таблицы. Таким образом, каждая строка таблицы будет соответствовать одной строке двумерного массива.

Но если вы хотите получить двумерный массив целиком, лучшим решением будет BLOB.

0 голосов
/ 18 октября 2008

Сериализация Java для байтового массива, хранящегося как BLOB, будет вашим лучшим выбором. Java будет эффективно сериализовать большой массив. Используйте оставшиеся столбцы строк для всего, что вас интересует, к которому вы можете обращаться с запросами или легко отображать их. Также может быть хорошей идеей хранить большие двоичные объекты в их собственной таблице и указывать, что «обычные» строки указывают на строки «больших двоичных объектов», если вы часто запрашиваете и сообщаете данные, отличные от BLOB (хотя это может варьироваться в зависимости от реализации базы данных ).

0 голосов
/ 18 октября 2008

PostgreSQL имеет встроенную поддержку массивов.

http://www.postgresql.org/docs/8.0/interactive/arrays.html

0 голосов
/ 18 октября 2008
  • Сделайте это в одной большой явной транзакции. Не заставляйте систему базы данных создавать новую неявную транзакцию для каждой вставки.
  • Используйте подготовленное утверждение.
...