Ответы пользователя по тегу PostgreSQL
  • Как добавить отношения "многие-ко-многим" между таблицами из разных баз данных?

    @rPman
    Если это сделано специально то не надо так делать.

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

    Если прямо очень надо, то для начала нужно понять, какая сторона будет 'главной', кто будет выдавать идентификаторы и следить за их согласованностью. Если главного выбрать не получается, то идентификаторы можно создавать двумя способами:
    - генерация GUID, который специально разработан быть статистически уникальным, на чьей бы стороне он не был создан (128бит)
    - добавление в идентификатор объекта идентификатора ноды, алгоритмы бывают разные, самый простой, определить максимальное количество нод и выделить в идентификаторе несколько бит для их номера (например максимальное количество нод 256, это 8бит в идентификаторе, пусть будут младшие)
    Ответ написан
    Комментировать
  • Как исправить неправильное отображение данных в csv после экспорта?

    @rPman
    майкрософтовский эксель по умолчанию (когда ты открываешь csv файл из проводника) ожидает то ли DOS кодировку cp866 то ли windows cp1251 (это для кирилицы), в общем однобайтовую. Чтобы была возможность выбирать (у тебя utf8), нужно открыть пустой документ и из меню данные выбрать вставить из текста, там откроется диалоговое окно с возможностью выбирать (офис помнит импортированный файл и может его повторно перезагружать с сохраненными настройками).

    libreoffice calc диалоговое окно импорта открывает сразу при открытии .csv

    Еще, настоятельно рекомендую в качестве разделителя выбирать ';' или символ табуляции '\t'
    Ответ написан
    Комментировать
  • Можно ли корректно забэкпить БД Postgres в Proxmox?

    @rPman
    Если в момент создания снапшота ты штатно останавливал 1c (и в идеале всю операционную систему) то снапшот будет консистентным

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

    Если используется паравиртуализация (скорее всего если гостевая ос - linux то она будет использоваться), то создание снапшота и его восстановление равнозначно снятие процесса через kill (причем скорее всего каким-нибудь ключом -BUS, так как сервера с критичным отношением к данным слушают обычный kill и доделывают критичные записи перед его исполнением), т.е. файловая система не будет нарушена.

    p.s. лучшим и самым оперативным бакапом является настройка master-master репликации базы данных (в твоем случае это pg) на резервную ноду, и при сбоях основной, резервная база будет максимально точной и рабочей базой, если реплицировать и файловую систему (средствами файловой системы или хранилища, так же master-master) на нее же, то ноду можно будет использовать как полноценный сервер, запуск которого - секунды (после чего можно чинить основной сервер, восстанавливать репликацию, при правильной настройке она догонит по изменениям теперь уже резервную базу, и теперь уже эта нода будет резервной к текущей рабочей, так меняя местами ноды можно получить непрерывную работу сервера, устойчивого к сбоям оборудования и сети)
    Ответ написан
    Комментировать
  • Как связать YandexGPT с базой данных?

    @rPman
    При наличии доступа к весам llm, мощностям для finetuning и переобучения, специалистам по нейронным сетям, можно сделать ряд сопроводительны нейронок, которые будут помогать принимать решение о дальнейших действиях, закодировать большое количество 'дорожек' из llm к формальным базам данных, и сделать задачу якобы решенной.

    По факту llm будет решать одну единственную задачу - текстовый интерфейс на естественном языке к интерфейсу к базе данных. Т.е. набор функционала и запросы, которые можно делать к базе нужно будет закодировать заранее.

    Если не углубляться
    - во первых, тебе нужно на основе llm сделать классификатор, который будет из текста пользователя понимать, intent - какое именно действие он желает сделать (для этого обучают нейронку на основе pretrained llm, возможно убирают последние слои, заменяя их на новые, веса которых нужно будет найти и обучить на основе подготовленной базы вопросов пользователей и соответствующих им реакций, с некоторой долей вероятности можно попробовать без обучения спрашивать у умной llm типа chatgpt4, к сожалению chatgpt3.5 и сравнимые с ней плохо с этим справляются, точнее это вопрос творческий и возможно вместо одного универсального промпта тут нужно готовить франкенштейна из большого количества разных, llm-ка от яндекса не подойдет).
    - во вторых, это сбор информации, отличный пример - человек спрашивает брать ли завтра зонтик, мало сети понять что для ответа на вопрос нужно знать какая будет погода завтра (а завтра это через сколько часов?), нужно понять где этот человек находится и возможно задать наводящий вопрос... это я еще молчу про контекст беседы, может пользователь обсуждает о том что взять с собой в поездку на следующей неделе, т.е. вот уже другое время и место (фраза взять с собой может подразумевать - положить в багаж).
    Я видел примеры промптов, с помощью которых из лога беседы можно вытягивать элементы информации (список этих элементов придется заранее забивать соответственно тому интерфейсу, который выбран как целевой на первом шаге), что то типа проанализируй, достаточно ли в данном тексте информации для ответа на вопрос, выделяя в промпте цель, собранную информацию и часть лога беседы, может сжатой через саморизацию с фильтром - нужную для данной задачи (этакая симуляция большого окна контекста).
    Вот тут у директора по развитию ии от яндекс спрашивали как раз

    Не получится брать сырой поток сообщений, добавлять к ним промпт и надеяться получить сразу результат, это кропотливая работа, по преобразованию потока сообщений в некую выжимку, работа с ней разными запросами и заранее подготовленными нейронками (это на порядок эффективнее, кстати то где слабые сети еще могут давать результат, повторяю, нужен доступ к весам, оборудованию и собирать датасеты)

    p.s. С некоторой долей риска можно просить на ходу нейронку генерировать sql запросы на основе вопросов пользователя, результат будет с большими ошибками, чем умнее llm-ка тем сложнее эти ошибки будет обнаружить (в автоматическом режиме я имею в виду).

    upd. вот тут из гигачата сделали внутреннюю базу и как то интегрировали нейронку чтобы ею пользоваться, подробности не сообщили но в статье и комментариях есть ссылки на работы и технологии
    Ответ написан
    1 комментарий
  • Как ускорить выборку из базы данных асимметрично зашифрованных данных?

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

    Подход шифрования выбран неправильно, вместо шифрования значений, нужно шифровать всю базу данных средствами ос. При запуске базы данных будет требовать пароль, но вся работа будет как не шифрованной базой
    Ответ написан
  • Как перенести базу данных из СУБД Postgresql в MySQL?

    @rPman
    Если ты программист, то написать программу в 10 строчек, копирующую содержимое заданной таблицы из одной базы в другую для тебя не должно быть проблемой. Как минимум на php с использованием PDO проблем не возникнет.

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

    p.s. экспортировать и импортировать данные в своем формате умеют некоторые универсальные GUI для баз данных, например та же WorkBench, там тоже можно сделать экспорт отдельно в виде insert-ов и отдельно структуру.

    p.p.s. ну перенесли вы данные, но данные это самое легкое, запросы тоже переносить нужно, а вот тут совместимость может быть слабая.
    Ответ написан
    Комментировать
  • Как в предварительном запросе передать переменной $ значение полей?

    @rPman
    Да, параметризовать можно только значения но не наименование полей и таблиц (мало того ты и prepared запрос так не сможешь сделать, с каждым новым значением $(column) будет новый запрос).

    Да, тебе придется валидировать значение в $(column) но это не сложно так как там допускаются только латинские буквы (оба регистра), цифры и подчеркивание. Конечно если ты не используешь идентификаторы_в_ковычках (там любые символы, но зачем тебе стрелять себе в ногу), ну в крайнем случае как разработчик ты знаешь что у тебя в запросе и какие допустимые наименования полей там могут быть
    Ответ написан
    1 комментарий
  • Какие таблицы работают эффективнее?

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

    Так как объем ПЗУ значительно выше (при той же стоимости) чем ОЗУ (а требования к ней таковы что индексы желательны влезать в нее, хотя бы для оперативных запросов) то лучше забить на оптимизацию по занимаемому месту данными, чем увеличить кратно требования для оперативного хранения индексов.

    Поэтому - не дроби на большое количество таблиц, пусть будет меньше таблиц с большим количеством полей, но без фанатизма, если видишь что появляется куча условий not null когда как для нескольких таблиц это отрабатывается inner join, то тогда да (not exists лучше чем is null).

    p.s. в догонку про сериализацию данных в одно поле, когда одно поле БД хранит сразу несколько значений - это оправдано и даже рекомендуется, если эти данные не имеют смысл по отдельности, красивый пример ip-адрес и порт как настройки подключения - суть одни данные, и нет никакого смысла разделять их на разные поля базы, за исключением случаев когда возможно потребуется активная аналитика по отдельному полю (например по ip адресу) - 'активная' тут это значит нужно строить индексы и делать частые запросы а не разовый full scan бакэндом.

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

    @rPman
    загляни в файловую систему и посмотри с какой скоростью растет tablespace файлы, так же можно с помощью запроса
    select pg_tablespace_size ('new_tablespace');
    так как в момент добавления колонки таблица копируется (это потому что default значение прописано) значит места должно потребоваться приблизительно в два раза больше чем было изначально, соответственно оценивай приблизительно по скорости роста файла

    https://habr.com/ru/company/yandex/blog/435880/
    Ответ написан
    Комментировать
  • Как лучше хранить денежные суммы в Postgres?

    @rPman
    Главный бонус использования 3 варианта - не будет важна поддержка (т.е. ее отсутствие) чисел с переменной фиксированной точностью на бакэнде. Например в php любой драйвер преобразует числа в double со всеми вытекающими от сюда проблемами.

    Недостаток - можно будет попасть на лимиты стандартных целых чисел (для 64-битных систем, например php), например если на tron ты попробуешь так реализовать работу с токеном usdd, то ты обнаружишь что его точность абсурдна - 18 знаков после запятой, и придется использовать соответствующие классы для работы с ним. Если не преобразовать в запросе тип поля в строку, тот же php pdo преобразует слишком большие целые числа в double

    p.s. bitcoin lightning network добавили пару значимых знаков, советую об этом тоже подумать
    Ответ написан
    2 комментария
  • Как написать SELECT запрос c добавлением столбца?

    @rPman
    читать про left join
    условие на null - поле is null это для фильтрации или использовании в case ... then ..., еще есть функция nullif

    либо в программе ноль проверяй средствами бакэнда или фронтэнда, это зависит от используемых языков ли фреймворков
    Ответ написан
  • Как используя минимум ресурсов, при помощи python, sql и библиотек psycopg2 и pandas составить запрос к базе postgre используя данные dataframe?

    @rPman
    Либо ты загружаешь все себе в память и там ковыряешься либо загружаешь всю или критичную для принятия решения информацию в одну базу (целевую или создав новую) и там ковыряешься

    все остальные варианты - некрасивые

    p.s. судя по коду тебе просто нужно взять идентификаторы из экселя и по ним найти записи в базе, попробуй собрать все идентификаторы в список и сделать огромный select ... where id in (...), кстати можно собирать некоторое их количества и делать блоками по к примеру 1000 записей

    p.p.s. когда народ перестанет делать так и начнет пользоваться именованными параметрами?
    t.id=\'" + str(m_list[i][1]) + '\'
    Ответ написан
    Комментировать
  • Есть ли разница для скорости работы БД при установке типа text, а не varchar 128?

    @rPman
    varchar/text/bytea в postgres используют одну и ту же технологию хранения и производительность будет напрямую зависеть от реального размера строк и от оптимизаций
    https://habr.com/ru/company/tensor/blog/498292/
    Ответ написан
    Комментировать
  • Как лучше хранить и пересылать время: как полную дату или только время?

    @rPman
    храни и передавай как число секунд, огромное количество готовых функций, во всех языках, не подходит только для исторических дат (все что старее unixtime 1970г, во всех остальных случаях - удобно, просто, быстро.

    если на стороне базы данных много работы со временем, то храни соответствующим типом в базе, но передавать лучше готовыми сериализаторами, и не изобретать паровоз.
    Ответ написан
    1 комментарий
  • Как выбрать базу данных?

    @rPman
    Ни один адекватный разработчик не будет не разобравшись с задачей писать 10k событий как отдельные события, в подавляющем большинстве случаев данные собираются в пакеты и только тогда пишутся, причем зачастую можно так и хранить.

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

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

    Отделяй модуль/место сбора оперативных данных от их анализа, например делай две базы, отличающиеся как по месту размещения так и по типу (например оперативные данные можно просто собирать в ram, с космическими скоростями, без sql отдельным приложением-демоном), а аналитику собирать паралельно и периодически, под задачу.
    Ответ написан
    1 комментарий
  • Можно ди обойти ошибку "duplicate key value violates unique constraint" при обновлении?

    @rPman
    duplicate key value violates unique constraint
    google translate:
    повторяющееся значение ключа нарушает уникальное ограничение

    ничего не напоминает?

    один из индексов типа unique в таблице не позволяет, значение после обновления будет повторяться
    Ответ написан
  • Как хранить изображение в бд?

    @rPman
    Все зависит от проекта
    Есть ситуации, когда ссылки на изображения не хранятся в базе данных а размещены только в шаблонах и html файлах, которые так же являются файлами (т.е. полностью вне базы данных)... не всегда такой подход удобен (особенно при обслуживании базы, например поиск файлов на которые никто не ссылается) но он самый оптимальный, ведь нет оверхеда по работе с базой данных.

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

    Просто помните - файловая система это тоже база данных, современные файловые системы очень эффективно обрабатывают запросы, с индексацией по части ключа (путь к файлу - каталоги в нем)... а некоторые, типа btrfs/zfs/xfs через снапшоты предлагают встроенный аналог транзакций как многие sql базы данных (только пользоваться нужно с умом этим).
    Ответ написан
    Комментировать
  • Как узнать общее количество посещений моего сайта?

    @rPman
    Не забудь ответить на вопрос - что значит посетитель (например кто то взял ссылку с картинкой с сайта и разместил ее на другом сайте в теге img, все кто увидят эту картинку - посетители?), повторный заход старого пользователя считать как новый или нет? как долго хранить информацию?

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

    Сторонние скрипты от рекламных сетей дадут готовую информацию, но не забывай, таким образом ты отдаешь своих пользователей (их приватную информацию) 'на растерзание' им...
    Ответ написан
    Комментировать
  • Какую базу выбрать для bigdata?

    @rPman
    Так как автор молчит про особенность своей задачи, значит можно предположить что угодно? например write once read many базы данных? с запросом только данных по временному интервалу?

    Пили самописное что-нибудь на основе файлов.

    Современная файловая система, если это не какой-нибудь fat, - это отличная key-value база данных, причем самая быстрая из возможных, но без инструментов индексирования (кроме поиска по имени, если дробить его по подкаталогам то не будет лишних накладных расходов, например на обслуживание), а так как у автора временные ряды, раскидать по файлам-каталогам соответственно временным интервалам (дни или часы), разбив данные по еще какому либо признаку, если нужна фильтрация по нему, можно получить искомый результат фактически забесплатно (нечего там кодить). Например, если тебе нужны редкие транзакции (атомарно менять большой объем данных не ломая чтение) то какой-нибудь btrfs представит этот функционал за бесплатно на основе снапшотов.

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

    Некоторые сложности может создать задача частых запросов на чтение, в этом случае нужно физически разнести голову массива данных и основное хранилище (например голова на ssd все остальное на hdd), а перенос проводить в момент наименьшей нагрузки, ну само собой можно и все на ssd если денег хватает, просто когда такой поток данных, сразу терабайты мерещатся
    Ответ написан
    Комментировать
  • Корректна ли будет такая организация Docker-контейнеров?

    @rPman
    Зачем ты разделяешь части приложения по доккер образам?

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

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

    так что ответ, хватит одного максимум двух образов
    Ответ написан