LINUX.ORG.RU

Реляционные базы данных и индексы

 , ,


0

4

Два вопроса:

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

  2. Я знаю 2 способа быстрого поиска элемента в контейнере:
    а) красно-черное дерево - у него сложность O(log N), и при этом все элементы отсортированы
    б) хэш-таблица - сложность O(1), но при этом нет упорядоченности элементов.
    Есть ли РСУБД, которые позволяют выбирать между этими двумя опциями при создании индекса?

Ну и вообще, есть ли случаи, когда целесообразно хранить картинки в самой базе данных, особенно применительно к sqlite?


хранились отдельно в уникальном виде (в самой базе данных), а в строках самой таблицы хранились например указатели на них

Это делается явно, т.е. ты сам должен так организовать хранение.

Есть ли РСУБД, которые позволяют выбирать между этими двумя опциями при создании индекса

Почти везде так можно.

хранить картинки в самой базе данных

Смотря что за картинки и в каком применении. Например иконки, или миниатюры может быть имеет смысл.

no-such-file ★★★★★
()

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

PostgreSQL хранит большие значения в отдельном хранилище. Не знаю, на счет уникальности. Нужно смотреть в документации, может и есть такое.

urxvt ★★★★★
()

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

Обычные реляционные СУБД таким не занимаются. Такая логика есть, например, в индексах Lucene (Elasticsearch, OpenSearch и др). Наверняка что-то подобное можно обнаружить в аналитических базах вроде Clickhouse, но не уверен.

Я знаю 2 способа быстрого поиска элемента в контейнере

СУБД не используют красно-черные деревья, потому что они плохо работают на дисковых хранилищах. Вместо этого используются другие сбалансированные деревья. В PostgreSQL есть возможность выбрать тип индекса – «btree» по-умолчанию и «hash» по выбору. Но я еще ниразу не видел, чтобы hash кто-то использовал.

maxcom ★★★★★
()
Последнее исправление: maxcom (всего исправлений: 1)

Ну и вообще, есть ли случаи, когда целесообразно хранить картинки в самой базе данных, особенно применительно к sqlite?

Смотря что за картинки. Я так делал хранение факсимиле и печати компании, чтобы при изменении юр.лица, автоматически с определённой даты на документах менялась печать и подпись. Удобно было.

А если что-то большое и в большом количестве, то возможно и лучше будет ссылкой на ФС хранить. А ключ, ну тут уже как душа пожелает.

Loki13 ★★★★★
()
  1. Один из основных принципов баз это дедупликация. В том же Clickhouse можно сделать колонку LowCardinality(String), которая создаст дополнительный словарь для ускорения. В Postgresql наверное надо хэши хранить рядышком, а уж про встроенные решения с btree индексом уже написали.
  2. Многие базы и файловые системы на B-tree, в том числе самые производительные вроде Clickhouse. Такая уж удачная структура у него.
ac130kz ★★
()
Последнее исправление: ac130kz (всего исправлений: 1)

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

А не рассматривал вариант самому считать хэш и не заниматься постоянно отправкой больших повторяющихся данных на сервер, а только при необходимости?

man-from-36
()

Привет. В дополнение к вариантам архитектурного выноса в отдельную таблицу, добавлю: в Oracle есть такая штука - BFILE. Это ссылка на blob, хранящийся как отдельный файл. Ну и держим в голове, что blob>4000 байт сам хранится в отдельном экстенте (не в таблице). Как-то раз делал небольшое приложение на хранимках, так там все картинки/иконки для вебинтерфейса хранились в блобах, файлов (кроме субд) вообще не было :)

Paka_RD
()

большие данные хранились отдельно в уникальном виде (в самой базе данных), а в строках самой таблицы хранились например указатели на них, или их хэши?

В постгресе это называется large objects. У конкурентов что-то такое тоже должно быть.

Не рекомендую, бэкап/развёртывание базы превращается в ту ещё мазафаку.

Ну и вообще, есть ли случаи, когда целесообразно хранить картинки в самой базе данных, особенно применительно к sqlite?

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

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

1. В контент-провайдере мелодий-картинок в OracleBI картинки хранились как атрибуты - так их было сразу видно в BI . Естественно, бд была не в фс, а оракловый партишн, а в раздаче клиентам оно было в фс. И это было 20 лет назад.

2. На локальном flask+postgres под офтопиком для разработки и отладки MVP

Shadow ★★★★★
()
Последнее исправление: Shadow (всего исправлений: 5)
Ответ на: комментарий от ac130kz

в том числе самые производительные вроде Clickhouse.

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

Psilocybe ★★★★
()
Ответ на: комментарий от Paka_RD

там все картинки/иконки для вебинтерфейса хранились в блобах

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

В общем, так лучше не делать.

Psilocybe ★★★★
()
Ответ на: комментарий от Shadow
  1. В оракловый партишен я в принципе могу поверить, окей, там и бэкапы делает специально обученный сертифицированный человек.

  2. Я всё же больше про запущенное в эжксплуатацию. Локалхост и не такое стерпит.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

про запущенное в эжксплуатацию

Эксплуатация тоже разная бывает. У меня в одной конторе скоро 10 лет как крутится Postgres с картинками внутри. Там нагрузка/объемы позволяли так сделать, чтоб не связываться с правами доступа ещё и на уровне файловой системы.

Astra + мандатный доступ внутри ПГ + RowLevelSecurity = не надо думать про безопасность на уровне файлов отдельно.

Toxo2 ★★★★
()
Последнее исправление: Toxo2 (всего исправлений: 1)
Ответ на: комментарий от Toxo2

Главное только не доводить до того, что закончится место на ФС. Потому что как это случится так наступит тупиковая ситуация, которую довольно сложно разрешить.

maxcom ★★★★★
()