Представление редких данных в PostgreSQL

Что лучший способ состоит в том, чтобы представить редкую матрицу данных в PostgreSQL? Два очевидных метода, которые я вижу:

  1. Храните данные на сингле таблица с отдельным столбцом для каждой мыслимой функции (потенциально миллионы), но со значением по умолчанию ПУСТОГО УКАЗАТЕЛЯ для неиспользованных функций. Это концептуально очень просто, но я знаю, что с большинством реализаций RDMS, что это обычно очень неэффективно, так как Нулевые значения ususually занимают некоторое место. Однако я читал, статья (не может найти ее ссылку, к сожалению), который утверждал, что PG не поднимает данные для Нулевых значений, делание его лучше подошло для того, чтобы хранить редкие данные.

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

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

Есть ли какие-либо другие решения? Какой я должен использовать?

18
задан Cerin 7 April 2010 в 14:56
поделиться

2 ответа

На ум приходят несколько решений,

1) Разделите ваши функции на группы, которые обычно устанавливаются вместе, создайте таблицу для каждой группы с однозначным отношением внешнего ключа к основным данным, присоединитесь только к таблицам, которые вам нужны при запросе

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

3) Аналогично тому, как это делает PostgreDynamic, создайте таблицу для каждого «столбца» в вашей основной таблице (они используют отдельное пространство имен для этих таблиц) и создайте функции для упрощения (а также эффективного индексации) доступа и обновления данных в этих таблицах

4) создать столбец в ваших первичных данных, используя XML или VARCHAR, и сохраните в нем некоторый структурированный текстовый формат, представляющий ваши данные, c повторно создавать индексы данных с помощью функциональных индексов, писать функции для обновления данных (или использовать функции XML, если вы используете этот формат)

5) используйте модуль contrib / hstore для создания столбца типа hstore, который может содержать ключ пары -значение, которые можно индексировать и обновлять

6) жить с большим количеством пустых полей

8
ответ дан 30 November 2019 в 08:21
поделиться

ПУСТОЕ значение не будет занимать места, если оно ПУСТО. Он займет один бит в растровом изображении в заголовке кортежа, но он все равно будет там.

Однако система не может работать с миллионами столбцов, точка. Существует теоретический максимум чуть более тысячи, IIRC, но вы действительно не хотите заходить так далеко.

Если вам действительно нужно столько, в одной таблице, вам нужно использовать метод EAV, о котором вы говорите в (2).

Если каждая запись имеет относительно мало ключей, я предлагаю вам в качестве третьего варианта взглянуть на модули contrib "hstore", которые позволяют очень эффективно хранить этот тип данных. В грядущей версии 9.0 он был улучшен, поэтому, если вы немного далеки от производственного развертывания, вы можете посмотреть прямо на него. Тем не менее, это того стоит и в 8.4. И он поддерживает довольно эффективный поиск по индексу. Определенно стоит посмотреть.

2
ответ дан 30 November 2019 в 08:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: