Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование в запросах полиморфных связей posgresql? / 25 сообщений из 25, страница 1 из 1
09.01.2020, 18:04
    #39912168
kealog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
Вводные.
Прочитал статью https://habr.com/ru/post/261835/ .
У меня полностью аналогичная ситуация:
1. Есть таблицы_с_данными - каждая под свой формат данных (тексты, числа, дата_время, ...) - поля у всех: id_строки_данных, значение.
2. Есть основная_таблица - связь этих данных с параметрами, к которым они относятся - поля примерно такие: id_параметра, наименование_таблицы_с данными, id_строки_данных

Сейчас для получения данных динамически написал функцию использующую полиморфный тип аргумента формирующую joint между основной_таблицей и таблицами_данных, написанную на основе примера отсюда https://qarchive.ru/30743_refaktoring_funktsii_pl_pgsql_dlja_vozvrata_rezul_tatov_razlichnyh_zaprosov_select#225331#11751557 раздел "Различные полные типы таблиц"

Вопрос.
Существует ли более "прямое" решение использующее полиморфные связи , что-то вроде:
SELECT основная_таблица.*,таблица_с_данными.значение FROM основная_таблица JOIN таблица_с_данными ON основная_таблица.id_строки_данных= таблица_с_данными.id_строки_данных WHERE основная_таблица.наименование_таблицы_с данными=тексты
...
Рейтинг: 0 / 0
10.01.2020, 11:02
    #39912332
jan2ary
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
kealog,

Как вы представляете муки оптимизатора в такой схеме?
Был у меня в продуктиве такой полиморф, творение сумрачного гения.
Постоянно ломался от того, что из-за пересчета статистики в плане менялся порядок вычисления предикатов и внезапно числа начинали сравниваться со строками, те с датами и т.д., все валилось на ошибках неявных преобразований. А потом "дба помоги да спаси"...
Спроектируйте нормально схему данных для начала.
...
Рейтинг: 0 / 0
10.01.2020, 11:53
    #39912351
kealog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
jan2ary,
Спасибо за отклик.
Про недостатки оптимизации читал. Альтернативную архитектуру/схему тоже себе представляю - там тоже проблем не избежать.
Однако хотелось бы узнать возможно ли сделать "прямое" решение описанное в Вопросе и увидеть как его сделать.
...
Рейтинг: 0 / 0
10.01.2020, 12:29
    #39912359
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
kealog

Вопрос.
Существует ли более "прямое" решение использующее полиморфные связи , что-то вроде:
SELECT основная_таблица.*,таблица_с_данными.значение FROM основная_таблица JOIN таблица_с_данными ON основная_таблица.id_строки_данных= таблица_с_данными.id_строки_данных WHERE основная_таблица.наименование_таблицы_с данными=тексты


EAV что ли? :-)
...
Рейтинг: 0 / 0
10.01.2020, 13:44
    #39912392
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
mad_nazgul
kealog

Вопрос.
Существует ли более "прямое" решение использующее полиморфные связи , что-то вроде:
SELECT основная_таблица.*,таблица_с_данными.значение FROM основная_таблица JOIN таблица_с_данными ON основная_таблица.id_строки_данных= таблица_с_данными.id_строки_данных WHERE основная_таблица.наименование_таблицы_с данными=тексты


EAV что ли? :-)


Это хуже потому что там еще типозависимый динамический sql добавляется изза того что EAV таблица не одна а по одной на каждый тип данных.
На SQL эта задача не реализуется в принципе.
...
Рейтинг: 0 / 0
10.01.2020, 14:53
    #39912434
kealog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
mad_nazgul,
В рамках данного вопроса, можно считать, что похоже на EAV, но в котором сущности и их отношения хранятся отдельно и только как их UID, а соответствующие им лексические представления и/или значения (текстовые/числовые/BLOB в отдельных таблицах, каждая из которых под соответствующий тип данных. Одну таблицу под все типы данных хранящиеся в текстовом поле не очень здорово делать, т.к. могут быть файлы/изображения/видео ... (знаю, что вместо хранения их в БД лучше делать ссылки на папки в которых хранить эти файлы)
...
Рейтинг: 0 / 0
10.01.2020, 15:00
    #39912444
kealog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
Maxim Boguk,
Пока реализовал через функцию prc_val с использованием полиморфного аргумента ... упрощённо так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR REPLACE FUNCTION public.prc_val(tbl_name anyelement)
 RETURNS SETOF anyelement
 LANGUAGE plpgsql
AS $function$
	begin
          RETURN QUERY EXECUTE format('SELECT * FROM %s', pg_typeof(tbl_name));
	END;
$function$;



которую вызываю из SQL-запроса, примерно так:
Код: plsql
1.
SELECT public.prc_val(NULL::vw_varchar);


здесь vw_varchar имя представления, которое получает данные из таблицы хранящей данные соответствующего типа (для другого типа данных будет, напрмиер, vw_double).

Однако полиморфный аргумент - это не полиморфная связь, которую непонятно как сделать, т.к. инфо по практическому её построению совсем не нахожу.
...
Рейтинг: 0 / 0
10.01.2020, 15:10
    #39912455
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
kealog
mad_nazgul,
В рамках данного вопроса, можно считать, что похоже на EAV, но в котором сущности и их отношения хранятся отдельно и только как их UID, а соответствующие им лексические представления и/или значения (текстовые/числовые/BLOB в отдельных таблицах, каждая из которых под соответствующий тип данных. Одну таблицу под все типы данных хранящиеся в текстовом поле не очень здорово делать, т.к. могут быть файлы/изображения/видео ... (знаю, что вместо хранения их в БД лучше делать ссылки на папки в которых хранить эти файлы)


Зачем?!
Когда в PostgreSQL есть наследование таблиц.

Если сильно хочется, то для каждого типа делаете наследника и там храните данные в типоспецфичном виде.
Можно еще посмотреть в сторону создания собственных типов (вроде бы есть примеры создания типа комплексных чисел и операции над ними)

Можно вообще использовать что-то типа рефлексии, как Java, используя метинофрмацию из БД.
...
Рейтинг: 0 / 0
10.01.2020, 17:15
    #39912547
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
Maxim Boguk
mad_nazgul
пропущено...

EAV что ли? :-)


Это хуже потому что там еще типозависимый динамический sql добавляется изза того что EAV таблица не одна а по одной на каждый тип данных.
На SQL эта задача не реализуется в принципе.

Это не хуже, т.к. целостность типов проверяется и индексация значений лучше.

И это не EAV, а 6NF при правильном проектировании Схемы. Необходимо в PK подчинённых таблиц добавлять не только ID, но и тип (хоть он и повторяется). И также включать его (тип) и в Представление поверх подчинённых таблиц (или мастер-таблицу в случае ПЖ).
https://stackoverflow.com/a/4731664/1154462

Правда, такая схема очень геморройная с точки зрения приложения. И если хотеть универсальности ради удобства, то Максим прав — не взлетит никак.
...
Рейтинг: 0 / 0
10.01.2020, 18:31
    #39912577
kealog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
mad_nazgul,
Спасибо за идею с наследованием. Только, возможно, она не решает мою задачу или я что-то не понимаю / не правильно делаю.
1. Создаю мастер-таблицу
Код: plsql
1.
CREATE TABLE t_parent (uid uuid NOT NULL DEFAULT uuid_generate_v4(), id_object int8,	CONSTRAINT t_parent_pkey PRIMARY KEY (uid));


2. Создаю наследников
а) для хранения varchar
Код: plsql
1.
CREATE TABLE t_varchar (vval varchar NULL) INHERITS (t_parent);


б) для хранения double
Код: plsql
1.
CREATE TABLE t_double (vval float8 NULL) INHERITS (t_parent);



3. Заполняю наследников данными и, ожидаемо, вижу в мастер-таблице заполненные поля
Для решения основной моей задачи (без использования функции динамической замены имён таблиц) мне нужно чтобы
Код: plsql
1.
SELECT * FROM t_parent;

вывел данные в виде таблицы с полями: uid, id_object, vval
Здесь же получаю только поля мастер-таблицы: uid, id_object
Поле vval этот запрос не видит.
...
Рейтинг: 0 / 0
10.01.2020, 18:55
    #39912586
kealog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
vyegorov,
Конечно же согласен, что нормализация для реляционных баз - это очень хорошо для производительности БД.
Однако здесь всегда упираемся в выбор между производительностью и гибкостью.
Чем выше требования к нормализации тем больше необходимость в том, чтобы уже в самом начале проектирования БД максимально точно и детально объекты предметной области (со всеми их свойствами/атрибутами в их онтологической взаимосвязи на всём жизненном цикле) отобразить в объекты (таблицы, связи) базы данных с учётом максимально полного покрытия сценариев потенциального использования. Почти всегда результатом является необходимость через непродолжительный период времени вешать в схему "заплатки". После того как под наросшими "заплатками" уже не разобрать и не восстановить что там было в начале, начинается виток полного переписывания схемы БД (и всех зависимых приложений).
Насколько удалось поизучать NoSQL базы (документоориентированные, графовые ...), они тоже не являются "серебряной пулей"
...
Рейтинг: 0 / 0
10.01.2020, 22:40
    #39912656
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
kealog,

Я может скажу банальность, но чем вам вместо таблицы_с_данными
не использовать JSONB, раз там есть свой формат данных (тексты, числа, дата_время, ...)
и индексировать и фильтровать можно гораздо интереснее через jsonpath
...
Рейтинг: 0 / 0
11.01.2020, 08:37
    #39912715
kealog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
Troglodit,
1) Поле JSONB (ключ-значение) подходит когда данные ключа в виде чисел, дат и недлинных текстов. Для хранения длинных текстов и файлов уже не очень.
2) В моём случае таблицы_данных (в первую очередь хранящие текстовые значения) в т.ч. выполняют функции похожие на словарь. Т.е. их значения используются повторно (для разных ключей ... многое-ко-многим). Если переводить в JSONB, то повторное использование этих данных для другого ключа уже невозможно, потребуется полное дублирования записи ключ-значение.
...
Рейтинг: 0 / 0
11.01.2020, 11:02
    #39912730
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
У вас под свой формат данных (тексты, числа, дата_время, ...)
Вдруг после 12 превратилось в тыкву хранения длинных текстов и файлов
Телепаты в отпуске.
Длинные тексты и файлы (зачем файлы в бд) в JSONB можно хранить просто пока доступ будет не такой эффективный.
Особенно интересно,если это что то похожее на словарь перекрестные ссылки, необходимость хранить ссылки на другие ссылки в таблицы_с_данными какая-нибудь метаинформация, что то вроде тэгов, категорийность.
Я пока с трудом представляю, что в реальности вы проектируете, но обычно если не получается натянуть сову на глобус, значит что то с не ладно в консерватории.
...
Рейтинг: 0 / 0
11.01.2020, 12:00
    #39912742
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
kealog

1) Поле JSONB (ключ-значение) подходит когда данные ключа в виде чисел, дат и недлинных текстов. Для хранения длинных текстов и файлов уже не очень.

Не надо хранить в операционной базе файлы, это не про производительность. Заведите под это дело отдельную базу, в основной храните только ключи.
kealog
2) В моём случае таблицы_данных (в первую очередь хранящие текстовые значения) в т.ч. выполняют функции похожие на словарь. Т.е. их значения используются повторно (для разных ключей ... многое-ко-многим). Если переводить в JSONB, то повторное использование этих данных для другого ключа уже невозможно, потребуется полное дублирования записи ключ-значение.
Используется похожее решение с таблицей-справочником, в качестве ID используется md5 от хранимого значения, в uuid типе (для плотности). Выгодно, если на одно значение много ссылок.
...
Рейтинг: 0 / 0
13.01.2020, 05:49
    #39913076
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
kealog,

Ну правильно. Родитель ничего не знает о полях потомка. :-)
Запрос к родителю вернет вам только список полейю
А вот значения нет. Т.к. они строго типизированные, то в одно поле курсора они не войдут.
Либо вам нужно все приводить к одному типу (например varchar), но тогда типизация вам нафиг не нужна.
...
Рейтинг: 0 / 0
13.01.2020, 05:56
    #39913078
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
kealog
Troglodit,
1) Поле JSONB (ключ-значение) подходит когда данные ключа в виде чисел, дат и недлинных текстов. Для хранения длинных текстов и файлов уже не очень.
2) В моём случае таблицы_данных (в первую очередь хранящие текстовые значения) в т.ч. выполняют функции похожие на словарь. Т.е. их значения используются повторно (для разных ключей ... многое-ко-многим). Если переводить в JSONB, то повторное использование этих данных для другого ключа уже невозможно, потребуется полное дублирования записи ключ-значение.


Вообще-то в докладе на конференции PGConf разработчики из PostgresPro не рекомендуют использовать JSON, JSONB для хранения данных, по которым потом будут строиться запросы и пр. Т.к. есть вероятность стремящаяся к 1, что это будет узким местом в производительности БД.

А так не совсем понятно, что вы хотите.
Если нужна строгая типизация, то "универсализма" не будет.
Вам нужно будет либо читать метоинформацию о типах в БД, либо самому где-то ее хранить.

Если же нужен не типизированный key-value, то возьмите NoSQL, они хотя бы оптимизированы под такое применение (читай выкинуто все лишнее).
...
Рейтинг: 0 / 0
13.01.2020, 11:55
    #39913142
kealog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
mad_nazgul,
Спасибо за инфо.
Буду изучать перспективу выделения хранилища значений в key-value базу данных.

P.S.:
Требования к такому хранилищу будут:
а) широко распространённое, бесплатное, устанавливаемое на собственный сервер;
б) хранение в key-value нетипизированных заранее данных;
в) хранение данных на диске;
г) высокая скорость чтения.

Судя по аналитике https://db-engines.com/en/ranking , из удовлетворяющих требованиям чистых key-value есть только Redis!?
Остальные (Cassandra, HBase и т.п.) - это уже wide column, т.е. избыточный функционал. Тоже можно посмотреть, но у них (например Cassandra) априори задан приоритет в скорости записи, а не чтения. Возможно, это будет узким горлышком.
В части Redis, по отзывам, она сильно проседает в производительности в случае хранения данных на диске.
...
Рейтинг: 0 / 0
13.01.2020, 11:56
    #39913143
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
mad_nazgul

Вообще-то в докладе на конференции PGConf разработчики из PostgresPro не рекомендуют использовать JSON, JSONB для хранения данных, по которым потом будут строиться запросы и пр. Т.к. есть вероятность стремящаяся к 1, что это будет узким местом в производительности БД.

Конечно, именно для этого они сами придумали JSONB, затем кастомное индексирование полей, затем даже язык запросов внутри JSONB реализовали (jsonpath),теперь его дорабатывают именно для того, что всем сказать "здесь рыбы нет".
...
Рейтинг: 0 / 0
13.01.2020, 14:31
    #39913231
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
Troglodit

Конечно, именно для этого они сами придумали JSONB, затем кастомное индексирование полей, затем даже язык запросов внутри JSONB реализовали (jsonpath),теперь его дорабатывают именно для того, что всем сказать "здесь рыбы нет".


Не совсем. Они предлагают "инструмент", но честно предупреждают, что от него нельзя ожидать чуда.
Т.е. в "общем случае" не структурированные данные (в виде JSON) будут по скорости проигрывать данным разложенным в РМД.
Соответственно "инструмент" нужно применять очень осторожно и думая.
Но если не хотите думать, то лучше его не использовать.
...
Рейтинг: 0 / 0
13.01.2020, 14:33
    #39913232
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
kealog

Судя по аналитике https://db-engines.com/en/ranking , из удовлетворяющих требованиям чистых key-value есть только Redis!?
Остальные (Cassandra, HBase и т.п.) - это уже wide column, т.е. избыточный функционал. Тоже можно посмотреть, но у них (например Cassandra) априори задан приоритет в скорости записи, а не чтения. Возможно, это будет узким горлышком.
В части Redis, по отзывам, она сильно проседает в производительности в случае хранения данных на диске.


Ну как обычно "серебряной пули" нет.
Поэтому надо исходить из конкретных условий задачи.
И соответственно задаче использовать техническое решение.
...
Рейтинг: 0 / 0
13.01.2020, 17:40
    #39913335
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
mad_nazgul

Не совсем. Они предлагают "инструмент", но честно предупреждают, что от него нельзя ожидать чуда.
Т.е. в "общем случае" не структурированные данные (в виде JSON) будут по скорости проигрывать данным разложенным в РМД.
Соответственно "инструмент" нужно применять очень осторожно и думая.
Но если не хотите думать, то лучше его не использовать.

Народ делал доклады, где пытался бенчить как раз сравнение с JSONB. Безусловно есть цена технологии, но она минимальна, при условии размера JSONB менее 2kb.
Я не агитирую, чтобы "давайте все валить в JSON".
Но посмотрите jsonpath. Когда его доделают-это будет бомба. Но даже сейчас очень просто и коротко писать запросы.
...
Рейтинг: 0 / 0
14.01.2020, 05:41
    #39913450
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
Troglodit
Народ делал доклады, где пытался бенчить как раз сравнение с JSONB. Безусловно есть цена технологии, но она минимальна, при условии размера JSONB менее 2kb.
Я не агитирую, чтобы "давайте все валить в JSON".
Но посмотрите jsonpath. Когда его доделают-это будет бомба. Но даже сейчас очень просто и коротко писать запросы.


Так я и не спорю, что при соблюдении определенных правил использования JSONB - это хороший инструмент.
Но если использовать "не думая" и нарушая правила, то проблем будет больше, чем удобства.

У меня лично был пример, когда на проекте решили хранить сущности в JSON-ах.
Я когда пришел, сказал, что не надо было так делать. Но там уже 2/3 проекта или больше было уже сделано и сроки поджимали.
Потом при опытной эксплуатации вляпались, во все возможные проблемы.
Начиная от проблем с производительностью, заканчивая большим геморроем с созданием отчетов.
...
Рейтинг: 0 / 0
14.01.2020, 19:15
    #39913910
Troglodit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
mad_nazgul
Troglodit
Народ делал доклады, где пытался бенчить как раз сравнение с JSONB. Безусловно есть цена технологии, но она минимальна, при условии размера JSONB менее 2kb.
Я не агитирую, чтобы "давайте все валить в JSON".
Но посмотрите jsonpath. Когда его доделают-это будет бомба. Но даже сейчас очень просто и коротко писать запросы.


Так я и не спорю, что при соблюдении определенных правил использования JSONB - это хороший инструмент.
Но если использовать "не думая" и нарушая правила, то проблем будет больше, чем удобства.

У меня лично был пример, когда на проекте решили хранить сущности в JSON-ах.
Я когда пришел, сказал, что не надо было так делать. Но там уже 2/3 проекта или больше было уже сделано и сроки поджимали.
Потом при опытной эксплуатации вляпались, во все возможные проблемы.
Начиная от проблем с производительностью, заканчивая большим геморроем с созданием отчетов.

Можете написать поподробнее, что там были за проблемы, а то как с сусликом, никто не видит, а он есть.
Я сам использую JSONB, но хотелось бы знать когда остановиться начать бить по рукам.
...
Рейтинг: 0 / 0
15.01.2020, 05:46
    #39914058
mad_nazgul
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование в запросах полиморфных связей posgresql?
Troglodit
Можете написать поподробнее, что там были за проблемы, а то как с сусликом, никто не видит, а он есть.
Я сам использую JSONB, но хотелось бы знать когда остановиться начать бить по рукам.


Вся сущность хранилась единым JSON'ом.
Сущности были версионированные и хранились в том же JSON'е.
НСИ хранились в одном большом JSONе.
Соответственно поиск по всему этому делу был очень долгий.
Если нужно было вытащить другую сущность по связи, опять лезем в JSON, чтобы ее вытащить.

Ребята делавшие отчеты тоже были очень рады, когда запрос по JSON'ам для разных сущностей + НСИ делался несколько часов.


И да. В зависимости от версии поля в сущностях могли меняться.
Для этого в том же JSON'е была метаинформация по полям.

В общем при создании редактировании еще было норм, но как только нужен был сложный поиск и отчеты начинались тормоза.
Плюс версионирование приносило немного веселья в эту ситуацию.

P.S. Вообще-то в начале предполагали, что система будет на MongoDB, но потом заказчик продавил БД.
Почему не изменили способ хранения данных ХЗ, я пришел на проект когда он уже "горел", и дедлайны были почти просраны.
И моя задача было интеграция со внешними системами.
Так что я особо боли не чувствовал.
Но на митапах постоянно стоял вопрос о скорости работы БД.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование в запросах полиморфных связей posgresql? / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]