Ответы пользователя по тегу PostgreSQL
  • Проблема с liquibase,выдает ошибку, что делать?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Предположительно он просто не находит liquibase-changelog.yml. Попробуй переложить его в другое место. Или изменить путь без classpath.
    Ответ написан
  • Как можно удалить запись в таблице?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Данные из таблиц как всегда удаляются через DELETE FROM table ... но если есть ограничения констрейнтов - то надо указать опцию CASCADE.

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

    Поэтому учитывая специфику системы я предлагаю вообще не удалять а просто ставить статус. Например если машина угнана, продана или лежит на свалке или разобрана за зап-части - то нужно соотв. Поменять ей владельца или статус.
    Ответ написан
  • Как выстроить правильные отношения в БД postgresSQL?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Вот здесь что-то не то.

    ALTER TABLE country ADD CONSTRAINT country_fk0 FOREIGN KEY (IdCountry) REFERENCES city(IdCountry);


    Тут таблицей промахнулся. Или направление констрейнта должно быть наоборот. Города ссылаются на страны. Но не наоборот.
    Ответ написан
    2 комментария
  • Есть ли разница для скорости работы БД при установке типа text, а не varchar 128?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Лимиты на текстовые поля - это архаизм и пережитки старины далёкой. Они имели большой смысл для DBase, Clipper, FoxPro но для современных БД практически уже неактуальны. Можно брать text.
    Даже Oracle вобщем-то снял лимит 4000 байт на строку и настройками системных параметров можно его растянуть хотя-бы в 32 килобайта.

    Тем более что в поля все чаще кладут semi-structured информацию (JSON/XML e.t.c).

    Но вы можете их использовать просто как констрейнт чтобы акцентировать внимание что поле имеет особый вид строки. Например хеш SHA-256 или какой-то ключ или UUID.

    Поддерживаю Дмитрия в наблюдении за oversized attribute.
    Ответ написан
    Комментировать
  • Как правильно сделать проверку Email?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Есть хорошая статья на эту тему https://habr.com/ru/post/175375/
    Ответ написан
    Комментировать
  • Как лучше хранить и пересылать время: как полную дату или только время?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если backend это Java - то заявлен тип данных java.time.LocalDate. Он - сериализуемый следовательно будет однозначно писаться и считываться из памяти и из сети.

    Вообще у программистов backend не возникает вопросов как "лучше хранить" и передавать время. Если вы хотите сильно экономить то храните и передавайте количество секунд с начала суток. Это будет целое число от 0 до 86400. Достаточно экономно. Но будете иметь свои трения при согласовании форматов между отделами разработки фронта и бєка. Можете передавать строкой как есть "08:40:20" но договоритесь о запрещенных комбинациях и так далее.

    Короче этот вопрос не про Postgres а про технологии сериализации даты-времени, стандарты и протоколы.
    Ответ написан
    Комментировать
  • Какой тип данных использовать для хранения паролей?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Пароль обычно обрабатывают. Добавляют некую символьную последовательность которая будет уникальна для данного приложения (salt) например abcxyz123. Это предотвращает подбор тривиальных хешей. После этого парольная фраза хешируется функцией (например) SHA-256. На выходе битовая последовательность - длиной 256 бит или в binhex кодировании (4 бита на символ) 64 символа. Вот эти символы можно вписать уже в текстовое поле типа text или varchar(64).
    Ответ написан
    Комментировать
  • Какой тип данных лучше использовать JSON или JSONB?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Какой формат данных (JSON или JSONB) лучше использовать в этой ситуации?

    Похоже автор занялся любимой задачей скучающих разработчиков. А именно - ПРЕЖДЕВРЕМЕННОЙ оптимизацией.

    JSON и JSONB возникли например из задачи хранения в БД ДОКУМЕНТОВ. Документ - предполагает специфический юзкейс. Например однократное создание и редкую модификацию. И частое чтение с поиском по текстовому индексу например.

    Является ли задача автора - подходящей под данный use-case? Чорт его знает. Я-бы сказал что пока нет. Все таки комментарии пользователя это такие себе... частые модификации документа которых хотелось-бы избежать.

    И вообще пока не будет создано 2 макета или 2 proof-of-concept с бенчмарками - мы не можем точно сказать что лучше.

    Сам-же Бартунов например в одном из своих докладов рассказывал что сама идея затащить в PG документы возникла из идеи работать с properties в одном поле. С такой себе неструктурированной информацией. А сама задача вознила из прикладной проблемы в дизайне базы для системы образования. Им нужно было хранить в строке неспецифицированный лист атрибутов. Это еще не JSON но уже дедушка его. Вот его так порешали. Это похоже на кейс автора? Я-бы сказал что далеко нет.

    Вообще чтоб доказать или опровергнуть огульный тезис о JSON-ификации я-бы довел постановку до абсурда. Зачем мы будем трекать комментарии в JSON. Давайте и посты туда-же. И странички. И вообще всю модель положим в 1 документ JSON. Каково а? У нас будет база с 1 единственной JSON строкой которая хранит в себе всё. Технологично? Да. И не запрещается.

    Вот как-то так.
    Ответ написан
    Комментировать
  • Можно ли мигрировать набор sql файлов в vcs based database management tool, для PostgreSQL?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Да вы правы. Здесь liquibase вполне себе подходит. Можно брать более модный flyway. Но будьте внимательны. Оба этих продукта имеют бесплатную и платную функциональности. Очень часто начинающие прокалываются на чтении документации и думают что фича есть. А на самом деле она - платная.

    Но для простого юзкейса (без откатов) возможностей бесплатной части вполне хватит.
    Ответ написан
    3 комментария
  • Sequlize postgres как изменить начальное значение auto increment?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можешь сразу после создания таблицы - вставить в нее 10 строк и тут-же удалить. :)
    Ответ написан
    Комментировать
  • Как удалить записи из таблицы, которые написаны не на русском языке?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В любом языке или системе программирования всегда есть функция которая получает из буквы ее код таблицы ASCII (или в наше время Unicode). Все английские и служебные символы будут в диапазоне от 32 до 127. Русские - соотв не попадают в этот диапазон.

    SELECT ascii('x');

    Проверить все буквы в строке - дело техники. Или другая задача.
    Ответ написан
    Комментировать
  • Как правильно сделать запрос с поиском текста?

    mayton2019
    @mayton2019
    Bigdata Engineer
    По всем ответам - согласен. Добавлю. В данной постановке точный поиск вообще не работает. Но работает fuzzy - поиск с использованием триграмм. Триграммы - это тройки букв которые должны максимально близко совпасть у шаблона и искомой строки. Чем их больше - тем выше similarity. Похожесть типа.

    Вобщем делайте поиск где SIMILARITY > 0.5 или какой-то любой величины. И выводите пользователю строки-кандидаты в порядке ранга похожести. И пускай он сам выбирает.

    Для скорости - стройте триграм-индекс. Вот тут для начала почитайте https://www.postgresql.org/docs/current/pgtrgm.html
    Ответ написан
    Комментировать
  • Оптимизация структуры БД. Какие варианты в данном случае?

    mayton2019
    @mayton2019
    Bigdata Engineer

    Перетащил это всё на MongoDB с такой структурой:

    Справочники остались в MySQL.
    .......
    Какие есть идеи?

    Думаю попробовать перенести структуру на PostgreSQL аналогично MongoDB и использовать

    Дружище. Так жеж не делается в мире Документно-ориентированных БД! В монге ты делаешь не таблицы. А хранилища документов. Где каждый документ - самодостаточен и полностью хранит в себе всю информацию. Грубо говоря никаких СПРАВОЧНИКОВ и СВЯЗНЫХ таблиц у тебя быть не должно. И нельзя джойнить документы. И нельзя джойнить документы с таблицами MySQL.

    Почитай про модель АГРЕГАТОВ в противовес реляционной модели. Это можно найти в книжках типа NoSQL и еще я находил это в доках по Cassandra.
    Ответ написан
    1 комментарий
  • Почему модели не синхронизируются с базой?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Похоже на сетевую проблему.

    Проведи диагностику на низком уровне. Пингуй хост DB_HOST.
    Попробуй телнетом подключится к порту DB_PORT.

    Потом - консолью
    $ psql ....
    Ответ написан
  • Как сделать auto increment колонку, которая увеличивается относительно другой колонки?

    mayton2019
    @mayton2019
    Bigdata Engineer
    По виду это похоже на троичную систему счисления. Ее можно получить просто пересчитывая нормальный sequence. Пишу на псевдокоде.

    create table ПочемуАвторНикогдаНеПишетНазваниеТаблиц (
       id sequence,
       class_id int GENERATED ALWAYS AS (id / 3),
       student_id int GENERATED ALWAYS AS (id % 3)  
    );
    Ответ написан
    Комментировать
  • Делаю changelog на pgsql выходить ошибка, как решить?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    Что за вертикальная палочка? Зачем она?

    ALTER TABLE sl.lesson {
        DROP CONSTRAINT lesson_timetable_id_fkey |
        DROP COLUMN timetable_id
    }


    А это что?
    liquibase.exception.ValidationFailedException: Validation Failed:


    Изменял change-sets грязными руками? Этого нельзя делать. То что установлено в репо - маркируется контрольной суммой и нельзя фиксить задним числом. Создаёшь новый changeset который исправляет.
    Ответ написан
    Комментировать
  • Можно при создании таблицы указать имя столбца в двойных кавычках?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Postgres по умолчанию - регистро-нечувствительный. И Oracle тоже.

    Тоесть можно сделать так.
    dh=> create table tab(id int);
    CREATE TABLE
    dh=> select * from tab;
     id 
    ----
    (0 rows)
    
    dh=> select * from TAB;
     id 
    ----
    (0 rows)

    Работать легко. Case-Insensitive. Как в языке Паскаль. И высоту регистра делать чисто для красоты. Например выделять ключевые слова SQL или сами идентификаторы.

    Но если по бизнес-задаче окажется что есть идентификатор для которого регистр ИМЕЕТ значение то мы его отковычиваем. Выглядит как при программировании на C++/Java. Вот в данном случае индекс FTS у нас записан аж тремя способами и все это разные колонки.

    dh=> create table "Market"("SnP" text, "FTS" text, "Fts" text, "fts" text);
    CREATE TABLE
    dh=> select * from "Market";
     SnP | FTS | Fts | fts 
    -----+-----+-----+-----
    (0 rows)


    Но работать в консоли становится неудобно. Больше надо клавиш нажимать.

    Поэтому решать вам.
    Ответ написан
    Комментировать
  • Есть ли штатный способ разбить большой UPDATE на транзакционные части?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можно так попробовать

    CREATE EXTENSION pgcrypto;
    
    BEGIN;
     // Partition 1 of 16
     UPDATE .... WHERE left(digest(ID, 'sha256'),1) = '0' 
    COMMIT;
    
    BEGIN;
     // Partition 2 of 16
     UPDATE .... WHERE left(digest(ID, 'sha256'),1) = '1' 
    COMMIT;


    У Oracle была более простая функция hash(...) которая разделяла сет ключей сразу на известное число партишенов. Там второй аргумент указывался. Но в PG я не знаю аналога. Может знающие подскажут.
    Ответ написан
  • Как объединить несколько копий приложения в одну?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для баз данных существует еще больше способов виртуализации. Кроме docker/kuber можно создавать много баз данных в одном и том-же хосте (pod). Но подумайте будет ли вам удобно бэкапировать такой будерброд. И не будет-ли проблем с безопасностью если кто-то будет создавать в одной базе public объекты.
    Ответ написан
    Комментировать
  • Как удалить дубликатные записи в postgresql?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Tayrus0 почитай еще про оконные функции. Ключевые слова ROW_NUMBER(), PARTITION BY.
    Ответ написан
    Комментировать