Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
09.01.2020, 18:04
|
|||
---|---|---|---|
Использование в запросах полиморфных связей posgresql? |
|||
#18+
Вводные. Прочитал статью 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 основная_таблица.наименование_таблицы_с данными=тексты ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 11:02
|
|||
---|---|---|---|
Использование в запросах полиморфных связей posgresql? |
|||
#18+
kealog, Как вы представляете муки оптимизатора в такой схеме? Был у меня в продуктиве такой полиморф, творение сумрачного гения. Постоянно ломался от того, что из-за пересчета статистики в плане менялся порядок вычисления предикатов и внезапно числа начинали сравниваться со строками, те с датами и т.д., все валилось на ошибках неявных преобразований. А потом "дба помоги да спаси"... Спроектируйте нормально схему данных для начала. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 11:53
|
|||
---|---|---|---|
Использование в запросах полиморфных связей posgresql? |
|||
#18+
jan2ary, Спасибо за отклик. Про недостатки оптимизации читал. Альтернативную архитектуру/схему тоже себе представляю - там тоже проблем не избежать. Однако хотелось бы узнать возможно ли сделать "прямое" решение описанное в Вопросе и увидеть как его сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 12:29
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
kealog Вопрос. Существует ли более "прямое" решение использующее полиморфные связи , что-то вроде: SELECT основная_таблица.*,таблица_с_данными.значение FROM основная_таблица JOIN таблица_с_данными ON основная_таблица.id_строки_данных= таблица_с_данными.id_строки_данных WHERE основная_таблица.наименование_таблицы_с данными=тексты EAV что ли? :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 13:44
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
mad_nazgul kealog Вопрос. Существует ли более "прямое" решение использующее полиморфные связи , что-то вроде: SELECT основная_таблица.*,таблица_с_данными.значение FROM основная_таблица JOIN таблица_с_данными ON основная_таблица.id_строки_данных= таблица_с_данными.id_строки_данных WHERE основная_таблица.наименование_таблицы_с данными=тексты EAV что ли? :-) Это хуже потому что там еще типозависимый динамический sql добавляется изза того что EAV таблица не одна а по одной на каждый тип данных. На SQL эта задача не реализуется в принципе. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 14:53
|
|||
---|---|---|---|
Использование в запросах полиморфных связей posgresql? |
|||
#18+
mad_nazgul, В рамках данного вопроса, можно считать, что похоже на EAV, но в котором сущности и их отношения хранятся отдельно и только как их UID, а соответствующие им лексические представления и/или значения (текстовые/числовые/BLOB в отдельных таблицах, каждая из которых под соответствующий тип данных. Одну таблицу под все типы данных хранящиеся в текстовом поле не очень здорово делать, т.к. могут быть файлы/изображения/видео ... (знаю, что вместо хранения их в БД лучше делать ссылки на папки в которых хранить эти файлы) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 15:00
|
|||
---|---|---|---|
Использование в запросах полиморфных связей posgresql? |
|||
#18+
Maxim Boguk, Пока реализовал через функцию prc_val с использованием полиморфного аргумента ... упрощённо так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
которую вызываю из SQL-запроса, примерно так: Код: plsql 1.
здесь vw_varchar имя представления, которое получает данные из таблицы хранящей данные соответствующего типа (для другого типа данных будет, напрмиер, vw_double). Однако полиморфный аргумент - это не полиморфная связь, которую непонятно как сделать, т.к. инфо по практическому её построению совсем не нахожу. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 15:10
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
kealog mad_nazgul, В рамках данного вопроса, можно считать, что похоже на EAV, но в котором сущности и их отношения хранятся отдельно и только как их UID, а соответствующие им лексические представления и/или значения (текстовые/числовые/BLOB в отдельных таблицах, каждая из которых под соответствующий тип данных. Одну таблицу под все типы данных хранящиеся в текстовом поле не очень здорово делать, т.к. могут быть файлы/изображения/видео ... (знаю, что вместо хранения их в БД лучше делать ссылки на папки в которых хранить эти файлы) Зачем?! Когда в PostgreSQL есть наследование таблиц. Если сильно хочется, то для каждого типа делаете наследника и там храните данные в типоспецфичном виде. Можно еще посмотреть в сторону создания собственных типов (вроде бы есть примеры создания типа комплексных чисел и операции над ними) Можно вообще использовать что-то типа рефлексии, как Java, используя метинофрмацию из БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 17:15
|
|||
---|---|---|---|
Использование в запросах полиморфных связей posgresql? |
|||
#18+
Maxim Boguk mad_nazgul Это хуже потому что там еще типозависимый динамический sql добавляется изза того что EAV таблица не одна а по одной на каждый тип данных. На SQL эта задача не реализуется в принципе. Это не хуже, т.к. целостность типов проверяется и индексация значений лучше. И это не EAV, а 6NF при правильном проектировании Схемы. Необходимо в PK подчинённых таблиц добавлять не только ID, но и тип (хоть он и повторяется). И также включать его (тип) и в Представление поверх подчинённых таблиц (или мастер-таблицу в случае ПЖ). https://stackoverflow.com/a/4731664/1154462 Правда, такая схема очень геморройная с точки зрения приложения. И если хотеть универсальности ради удобства, то Максим прав — не взлетит никак. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 18:31
|
|||
---|---|---|---|
Использование в запросах полиморфных связей posgresql? |
|||
#18+
mad_nazgul, Спасибо за идею с наследованием. Только, возможно, она не решает мою задачу или я что-то не понимаю / не правильно делаю. 1. Создаю мастер-таблицу Код: plsql 1.
2. Создаю наследников а) для хранения varchar Код: plsql 1.
б) для хранения double Код: plsql 1.
3. Заполняю наследников данными и, ожидаемо, вижу в мастер-таблице заполненные поля Для решения основной моей задачи (без использования функции динамической замены имён таблиц) мне нужно чтобы Код: plsql 1.
вывел данные в виде таблицы с полями: uid, id_object, vval Здесь же получаю только поля мастер-таблицы: uid, id_object Поле vval этот запрос не видит. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 18:55
|
|||
---|---|---|---|
Использование в запросах полиморфных связей posgresql? |
|||
#18+
vyegorov, Конечно же согласен, что нормализация для реляционных баз - это очень хорошо для производительности БД. Однако здесь всегда упираемся в выбор между производительностью и гибкостью. Чем выше требования к нормализации тем больше необходимость в том, чтобы уже в самом начале проектирования БД максимально точно и детально объекты предметной области (со всеми их свойствами/атрибутами в их онтологической взаимосвязи на всём жизненном цикле) отобразить в объекты (таблицы, связи) базы данных с учётом максимально полного покрытия сценариев потенциального использования. Почти всегда результатом является необходимость через непродолжительный период времени вешать в схему "заплатки". После того как под наросшими "заплатками" уже не разобрать и не восстановить что там было в начале, начинается виток полного переписывания схемы БД (и всех зависимых приложений). Насколько удалось поизучать NoSQL базы (документоориентированные, графовые ...), они тоже не являются "серебряной пулей" ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.01.2020, 22:40
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
kealog, Я может скажу банальность, но чем вам вместо таблицы_с_данными не использовать JSONB, раз там есть свой формат данных (тексты, числа, дата_время, ...) и индексировать и фильтровать можно гораздо интереснее через jsonpath ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.01.2020, 08:37
|
|||
---|---|---|---|
Использование в запросах полиморфных связей posgresql? |
|||
#18+
Troglodit, 1) Поле JSONB (ключ-значение) подходит когда данные ключа в виде чисел, дат и недлинных текстов. Для хранения длинных текстов и файлов уже не очень. 2) В моём случае таблицы_данных (в первую очередь хранящие текстовые значения) в т.ч. выполняют функции похожие на словарь. Т.е. их значения используются повторно (для разных ключей ... многое-ко-многим). Если переводить в JSONB, то повторное использование этих данных для другого ключа уже невозможно, потребуется полное дублирования записи ключ-значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.01.2020, 11:02
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
У вас под свой формат данных (тексты, числа, дата_время, ...) Вдруг после 12 превратилось в тыкву хранения длинных текстов и файлов Телепаты в отпуске. Длинные тексты и файлы (зачем файлы в бд) в JSONB можно хранить просто пока доступ будет не такой эффективный. Особенно интересно,если это что то похожее на словарь перекрестные ссылки, необходимость хранить ссылки на другие ссылки в таблицы_с_данными какая-нибудь метаинформация, что то вроде тэгов, категорийность. Я пока с трудом представляю, что в реальности вы проектируете, но обычно если не получается натянуть сову на глобус, значит что то с не ладно в консерватории. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.01.2020, 12:00
|
|||
---|---|---|---|
Использование в запросах полиморфных связей posgresql? |
|||
#18+
kealog 1) Поле JSONB (ключ-значение) подходит когда данные ключа в виде чисел, дат и недлинных текстов. Для хранения длинных текстов и файлов уже не очень. Не надо хранить в операционной базе файлы, это не про производительность. Заведите под это дело отдельную базу, в основной храните только ключи. kealog 2) В моём случае таблицы_данных (в первую очередь хранящие текстовые значения) в т.ч. выполняют функции похожие на словарь. Т.е. их значения используются повторно (для разных ключей ... многое-ко-многим). Если переводить в JSONB, то повторное использование этих данных для другого ключа уже невозможно, потребуется полное дублирования записи ключ-значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.01.2020, 05:49
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
kealog, Ну правильно. Родитель ничего не знает о полях потомка. :-) Запрос к родителю вернет вам только список полейю А вот значения нет. Т.к. они строго типизированные, то в одно поле курсора они не войдут. Либо вам нужно все приводить к одному типу (например varchar), но тогда типизация вам нафиг не нужна. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.01.2020, 05:56
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
kealog Troglodit, 1) Поле JSONB (ключ-значение) подходит когда данные ключа в виде чисел, дат и недлинных текстов. Для хранения длинных текстов и файлов уже не очень. 2) В моём случае таблицы_данных (в первую очередь хранящие текстовые значения) в т.ч. выполняют функции похожие на словарь. Т.е. их значения используются повторно (для разных ключей ... многое-ко-многим). Если переводить в JSONB, то повторное использование этих данных для другого ключа уже невозможно, потребуется полное дублирования записи ключ-значение. Вообще-то в докладе на конференции PGConf разработчики из PostgresPro не рекомендуют использовать JSON, JSONB для хранения данных, по которым потом будут строиться запросы и пр. Т.к. есть вероятность стремящаяся к 1, что это будет узким местом в производительности БД. А так не совсем понятно, что вы хотите. Если нужна строгая типизация, то "универсализма" не будет. Вам нужно будет либо читать метоинформацию о типах в БД, либо самому где-то ее хранить. Если же нужен не типизированный key-value, то возьмите NoSQL, они хотя бы оптимизированы под такое применение (читай выкинуто все лишнее). ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.01.2020, 11:55
|
|||
---|---|---|---|
Использование в запросах полиморфных связей posgresql? |
|||
#18+
mad_nazgul, Спасибо за инфо. Буду изучать перспективу выделения хранилища значений в key-value базу данных. P.S.: Требования к такому хранилищу будут: а) широко распространённое, бесплатное, устанавливаемое на собственный сервер; б) хранение в key-value нетипизированных заранее данных; в) хранение данных на диске; г) высокая скорость чтения. Судя по аналитике https://db-engines.com/en/ranking , из удовлетворяющих требованиям чистых key-value есть только Redis!? Остальные (Cassandra, HBase и т.п.) - это уже wide column, т.е. избыточный функционал. Тоже можно посмотреть, но у них (например Cassandra) априори задан приоритет в скорости записи, а не чтения. Возможно, это будет узким горлышком. В части Redis, по отзывам, она сильно проседает в производительности в случае хранения данных на диске. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.01.2020, 11:56
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
mad_nazgul Вообще-то в докладе на конференции PGConf разработчики из PostgresPro не рекомендуют использовать JSON, JSONB для хранения данных, по которым потом будут строиться запросы и пр. Т.к. есть вероятность стремящаяся к 1, что это будет узким местом в производительности БД. Конечно, именно для этого они сами придумали JSONB, затем кастомное индексирование полей, затем даже язык запросов внутри JSONB реализовали (jsonpath),теперь его дорабатывают именно для того, что всем сказать "здесь рыбы нет". ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.01.2020, 14:31
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
Troglodit Конечно, именно для этого они сами придумали JSONB, затем кастомное индексирование полей, затем даже язык запросов внутри JSONB реализовали (jsonpath),теперь его дорабатывают именно для того, что всем сказать "здесь рыбы нет". Не совсем. Они предлагают "инструмент", но честно предупреждают, что от него нельзя ожидать чуда. Т.е. в "общем случае" не структурированные данные (в виде JSON) будут по скорости проигрывать данным разложенным в РМД. Соответственно "инструмент" нужно применять очень осторожно и думая. Но если не хотите думать, то лучше его не использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.01.2020, 14:33
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
kealog Судя по аналитике https://db-engines.com/en/ranking , из удовлетворяющих требованиям чистых key-value есть только Redis!? Остальные (Cassandra, HBase и т.п.) - это уже wide column, т.е. избыточный функционал. Тоже можно посмотреть, но у них (например Cassandra) априори задан приоритет в скорости записи, а не чтения. Возможно, это будет узким горлышком. В части Redis, по отзывам, она сильно проседает в производительности в случае хранения данных на диске. Ну как обычно "серебряной пули" нет. Поэтому надо исходить из конкретных условий задачи. И соответственно задаче использовать техническое решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.01.2020, 17:40
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
mad_nazgul Не совсем. Они предлагают "инструмент", но честно предупреждают, что от него нельзя ожидать чуда. Т.е. в "общем случае" не структурированные данные (в виде JSON) будут по скорости проигрывать данным разложенным в РМД. Соответственно "инструмент" нужно применять очень осторожно и думая. Но если не хотите думать, то лучше его не использовать. Народ делал доклады, где пытался бенчить как раз сравнение с JSONB. Безусловно есть цена технологии, но она минимальна, при условии размера JSONB менее 2kb. Я не агитирую, чтобы "давайте все валить в JSON". Но посмотрите jsonpath. Когда его доделают-это будет бомба. Но даже сейчас очень просто и коротко писать запросы. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2020, 05:41
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
Troglodit Народ делал доклады, где пытался бенчить как раз сравнение с JSONB. Безусловно есть цена технологии, но она минимальна, при условии размера JSONB менее 2kb. Я не агитирую, чтобы "давайте все валить в JSON". Но посмотрите jsonpath. Когда его доделают-это будет бомба. Но даже сейчас очень просто и коротко писать запросы. Так я и не спорю, что при соблюдении определенных правил использования JSONB - это хороший инструмент. Но если использовать "не думая" и нарушая правила, то проблем будет больше, чем удобства. У меня лично был пример, когда на проекте решили хранить сущности в JSON-ах. Я когда пришел, сказал, что не надо было так делать. Но там уже 2/3 проекта или больше было уже сделано и сроки поджимали. Потом при опытной эксплуатации вляпались, во все возможные проблемы. Начиная от проблем с производительностью, заканчивая большим геморроем с созданием отчетов. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.01.2020, 19:15
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
mad_nazgul Troglodit Народ делал доклады, где пытался бенчить как раз сравнение с JSONB. Безусловно есть цена технологии, но она минимальна, при условии размера JSONB менее 2kb. Я не агитирую, чтобы "давайте все валить в JSON". Но посмотрите jsonpath. Когда его доделают-это будет бомба. Но даже сейчас очень просто и коротко писать запросы. Так я и не спорю, что при соблюдении определенных правил использования JSONB - это хороший инструмент. Но если использовать "не думая" и нарушая правила, то проблем будет больше, чем удобства. У меня лично был пример, когда на проекте решили хранить сущности в JSON-ах. Я когда пришел, сказал, что не надо было так делать. Но там уже 2/3 проекта или больше было уже сделано и сроки поджимали. Потом при опытной эксплуатации вляпались, во все возможные проблемы. Начиная от проблем с производительностью, заканчивая большим геморроем с созданием отчетов. Можете написать поподробнее, что там были за проблемы, а то как с сусликом, никто не видит, а он есть. Я сам использую JSONB, но хотелось бы знать когда остановиться начать бить по рукам. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.01.2020, 05:46
|
|||
---|---|---|---|
|
|||
Использование в запросах полиморфных связей posgresql? |
|||
#18+
Troglodit Можете написать поподробнее, что там были за проблемы, а то как с сусликом, никто не видит, а он есть. Я сам использую JSONB, но хотелось бы знать когда остановиться начать бить по рукам. Вся сущность хранилась единым JSON'ом. Сущности были версионированные и хранились в том же JSON'е. НСИ хранились в одном большом JSONе. Соответственно поиск по всему этому делу был очень долгий. Если нужно было вытащить другую сущность по связи, опять лезем в JSON, чтобы ее вытащить. Ребята делавшие отчеты тоже были очень рады, когда запрос по JSON'ам для разных сущностей + НСИ делался несколько часов. И да. В зависимости от версии поля в сущностях могли меняться. Для этого в том же JSON'е была метаинформация по полям. В общем при создании редактировании еще было норм, но как только нужен был сложный поиск и отчеты начинались тормоза. Плюс версионирование приносило немного веселья в эту ситуацию. P.S. Вообще-то в начале предполагали, что система будет на MongoDB, но потом заказчик продавил БД. Почему не изменили способ хранения данных ХЗ, я пришел на проект когда он уже "горел", и дедлайны были почти просраны. И моя задача было интеграция со внешними системами. Так что я особо боли не чувствовал. Но на митапах постоянно стоял вопрос о скорости работы БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=53&mobile=1&tid=1994867]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 274ms |
total: | 420ms |
0 / 0 |