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

    mayton2019
    @mayton2019
    Bigdata Engineer
    В реляционных БД нельзя сделать серебрянную пулю которая всегда будет успешно стрелять.
    Чаще всего в БД делают так. Анализируют какие группы запросов наиболее тяжелые
    и пытаются материализовать по 1 mat view на каждую группу.

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

    Поиск идет в одной из шард, определяемой по дате.

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

    Для поиска используется 2-3 поля, которые являются какими-либо идентификаторами, сильно сужающими выборку (до нескольких записей в пределах нужной даты).


    Если у вас есть тренд на использование 1-2 дней (оперативная информация)
    то отгрузите этот опер-период в отдельную свехр-быструю БД (Redis)
    и сгенерируйте все возможные комбинации запросов и ответов.

    Звучит странно но такая материализация может быть выгоднее чем точечные
    запросы (которые у вас не являеются OLTP т.к. возвращают в общем случае
    более чем 1 строку).

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

    Здесь я не очень понял, является ли указание отдела взаимоисключающим. Но попробуйте
    подумать направлении фасетов (facets). Это почти тот-же партишенинг-шардинг но ключ
    партишенинга будет сочетанием нескольких атрибутов.
    Ответ написан
    Комментировать
  • Какие есть инструменты и решения для экстремально быстрой online-аналитики потоковых данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    При расчете аналитики (min/max/avg) и прочих оконных функций сам алгоритм имеет лаг.
    Тоесть ты должен понимать что за 1 мс ты можешь анализировать данные в прошлом за окно
    размером к примеру в 100мс.

    Нельзя выводить точную аналитику на основе мгновенного значения.
    Ответ написан
  • На сколько популярно и корректно хранить данные в столбце в виде JSON строки?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В конце 20-го века, когда Эдгар Кодд развивал свою реляционную теорию было очень
    модно все данные нормализовывать для хранения их в БД. Это соотвествовало экономии
    ресурсов (диски мерялись килобайтами и мегабайтами) и нормализация хорошо ложилась на
    техно-стек. Все данные должны быть атомарны. И ты - плохой DBA и программист если
    кладешь в ячейку что-то более комплексное чем просто атом.

    В 2000х развитие веб и XML(XHTML/SGML, XSLT, XPath) дало толчок новым видам
    хранения информации в виде markup languages. Появляются технологии семанического веба.
    Мечтатели-теоретики создают RDF, OWL. Базы данных пытаются успеть втянуть в себя новые типы.
    Oracle начинает поддерживать XML+Schema как тип данных в таблице. Браузер начинает
    поддерживаеть трансформацию XML и обогащение его стилями. XML - моден. Его внедряют
    везде где можно и где не нужно. Даже в конфигах Apache Http и в сборщике Maven.

    Параллельно Дуглас Крокфорд работает над Java Scrip Obj Notation и создает лайтовый язык
    для описания объектов и документов. Они - конкурируют с XML но JSON практически побеждает
    в вебе, полностью захватывая веб протоколы (Ajax, WebSockets, e.t.c). И интеракцию с сервером.
    JSON становится более популярный для REST. Многие БД тоже начинают поддерживать JSON.
    Postgres даже делает бинарный JSON и добавляет спец-индексы для быстрого поиска атрибутов.
    Узко-специализированные системы такие как Mongo изначально заточены на храннение JSON
    информации.

    BigData плавно проростает в 2007 (кажется) и где-то в 2014 (или позже) году фреймворк Spark начинает поддерживать DataFrames + Structured Types которые по сути являются зеркалом JSON. Фреймворк
    позволяет грузить в бигдату JSON-lines датасеты, автоматически выводя схему.

    Это - финал. Я считаю что после такой конвергенции в бигдату JSON получил путевку везде где только можно.
    Сегодня вы можете без стыда использовать JSON везде в любых уровнях стека (даже в Redis) если
    у вас хватает памяти и вы уже порешали вопросы бизнес-согласованности данных и умеете эти
    данные инвалидировать и обновлять.

    Если поискать анти-паттерны применения JSON в базах данных - то я-бы предложил такую метрику.
    Если вы очень часто обновляете маленькое поле внутри большого JSON документа и это создает
    сильные I/O нагрузки то скорее всего вам надо перепроектировать вашу БД как-то по другому
    и вынести это поле во вне по отношению к документу
    Ответ написан
    5 комментариев
  • Какая зависимость в Java приложении к подключению БД?

    mayton2019
    @mayton2019 Куратор тега Java
    Bigdata Engineer
    1. Java (JDK/JRE) не содержит в себе драйверов доступа к БД вообще. В ней определен только базовый
    интерфейс java.sql.* и существует некий стандарт на то как драйверы должны работать. Например когда мы делаем ResultSet::close, или Statement::close, драйвер может ничего и не делать в этот момент. Все зависит от того
    как производитель (Oracle, MSSQL) реализовал под капотом работу драйвера. Поэтому как работает внутри драйвер это - тайна.

    2. Обычно если в приложении тебе часто и много нужно создавать объектов Connection, то используют пулы коннектов (Hikari Connection pool, DBCP, C3PO). Почитай в этом направлении. Пулы экономят сессионные
    объекты на стороне БД и создают новые коннекты быстрее за счет переиспользования сущесвтующих коннектов.
    В обычном (прямом режиме) работы с БД процесс установки соединения может занимать несколько секунд.
    Это может быть запредельно медленно для некоторых алгоритмов.

    3. В сложных ent. приложениях используются фреймворки типа Spring которые декларируют зависимости одник
    компонент от других
    и также обеспечивают ленивую инициализацию и работу синглтона. Всем новичкам
    нужно знать что такое синглтон и уметь им пользоваться. И лучше уметь это сначала без фреймворка
    чтобы понимать уже как это делает фреймворк.
    Ответ написан
  • Как синхронизировать базу данных и python?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если это - классическая БД типа SQL то у нее обычно нет возможностей слать нотификации об изменениях.
    Такова парадигма. Ты подключаешся к БД. Делаешь SQL запрос и принимаешь решение. Сама база - пассивна.
    Она ничего не делает. Просто стоит и ждет.

    Можешь делать запрос периодически (через 15 минут) и определять менялась таблица или нет по твоим
    известным тебе метрикам.

    Использовать здесь Python или Java или С++ - без разницы. Все они играют по правилам сетевого протокола БД.

    Возможно существуют технологии типа MQ/CDC которые нативно реализованы в конкретной БД , но это очень узкая, и специфичная тема, и ее точно не стоит рассматривать в тегах БАЗЫ ДАННЫХ.
    Ответ написан
    Комментировать
  • Как сравнить структуры двух БД и создать скрипт миграции?

    mayton2019
    @mayton2019
    Bigdata Engineer
    быстро сравнить структуры БД и сделать скрипт, который приводит одну БД к структуре второй?

    В этой задаче - большое количество подводных камней. Например что делать если в двух БД есть одинаковые
    поля но имеющие разный тип (NUMERIC / VARCHAR). Дилемма... Что делать с исчезающими полями?
    Удалять? Дилемма...

    Я вообще не видел коробочных решение которые бы работали на "раз-два-три". Всегда есть нюансы.
    И есть conditions которые нужно вбить или вкрутить в эти решения.

    Написать скрипты которые извлекают метадату из одной и из другой БД не очень сложно. Но само практическое
    применение подобных скриптов - ограничено. И я думаю что это как раз та причина по которой коробочные
    "миграторы" не прижились.
    Ответ написан
    Комментировать
  • 5 млн файлов JSON или DB?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Файловая система - самый дешевый способ хранения инфы. Если других требований нет - почему бы и нет?
    Ответ написан
    4 комментария
  • Как лучше для производительности mongo db?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Mongo и многие документ-подобные системы обычно оптимизируются не так как реляционки а как агрегаты.
    Тоесть ты подготовавливаешь для пользователя полностью самодостаточный документ который за 1 операцию
    извлекается и больше никаких joins не нужно.

    Ответить на твой вопрос можно только наблюдая за типичными запросами пользователя этой системы. Никакой другой здесь теории нету.
    Ответ написан
    Комментировать
  • Какой инструмент может превратить схему БД в панель управления или админку?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Практически такое решение будет очень небезопасным. Обычно вебу дается минимум доступа к БД и то
    через всякие сервисы и прослойки. А вы прям открываете вообще все что только есть. Это я думаю - плохой
    дизайн по безопасности. И пользователь может грохнуть целую таблицу случайно.

    Графические инструменты для работы с БД есть. Например JBeaver. Универсален и удобнее веба.
    Ответ написан
  • Какую БД выбрать?

    mayton2019
    @mayton2019
    Bigdata Engineer
    - Минимальный функционал, малое потребление ресурсов (никаких postgres)

    Насколько минимальный? Тут по идее подходит key-value система (Mongo, CouchDb, Tarantool). Но если ты захочешь сделать join то тебя ждет облом. Такая операция обычно не заложена в архитектуры key-value.

    А какой-то промежуточный гибрид между SQL и key-value скорее всего не существует в природе.
    Если уж вводить join - то это реляция. А реляция - это RDBMS.

    - В идеале невозможность удаления записи даже тем, у кого есть к ней доступ.

    Здесь подходит определение event-store. Сам продукт тоже так и называется https://db-engines.com/en/system/EventStoreDB

    Вот попробуй его. Но для делания запросов по такой БД там надо создавать материализованные
    представления. А это означает что надо просто глубже обсуждать твою архитектуру. Просто
    так... поплевав в потолок тут невозможно выбрать продукт.

    Вот такие у тебя варианты. Думай.
    Ответ написан
    Комментировать
  • Какая база данных подходит для частых UPDATE и сортировки?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Подходит любая БД. Вопрос в том чем вы готовы пожертвовать ради скорости. Например вы можете хранить данные в backend (hashtable) и сбрасывать их в БД периодически. Эта схема идеально работает. Вам только надо с самим собой и с бизнесом поговорить о гарантиях. Что вы хотите? Чтоб любой вектор {id, data, user_date} сохранялся в ту-же микросекунду или вы можете эти изменения отложить на потом и применить их в БД через 15 минут например в виде
    batch-update.

    Поэтому вопрос оптимизации БД - это вопрос не только технически но и организационный. А запись в Postgress в через длинный сетевой стек да еще и с фиксацией транзакции это такое яростное безкомпромиссное решение
    которое не всегда и нужно.


    Договаривайтесь с ценностью бизнес-информацией и с компромиссами.
    Ответ написан
    Комментировать
  • Как оптимальнее всего организовать хранение тяжёлых данных и чтобы потом максимально быстро доставать оттуда данные для отчётов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я знаю два сильных пути оптимизации в БД.

    1) Минимизация IOps. Тоесть уменшить число дисковых чтений. Для таблиц это достигается через
    partitions by date. Вычисляешь экспериментально оптимальный размер partition (например 1 неделя).
    И твои запросы по диапазону должны попадать в 1-2 partitions. Это исключает full-table-scan.
    Ну и индекс попробуй построить по предикатам фильтров.

    2) Материализация ответов. Для данных которые уже не будут изменяться ты строишь где-то такую
    табличку (матрицу по сути) где хранишь уже заранее расчитанные данные. Эта технология по разному
    может называться. Materialized View. OLAP cubes. Витрины данных. Но суть одна.

    start_date    end_date     result 
    01-02-2023    03-02-2023   { "1":"65", "2":"45" }


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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Существует только одна рекомендация по безопасности в таком случае. Ты не должен хранить ключи,
    токены, и пароли в исходнике самого приложения а ты должен его получать откуда-то из специального
    сейфа (Vault).


    API позволяет взять ключ по имени.

    Каждый хостинг-провайдер или платформа предоставляет такой сейф как услугу. Например для Microsoft
    Azure Cloud это Key Vault. Для облака Амазон это AWS Secrets Manager.
    Ответ написан
    Комментировать
  • Как лучше хранить данные фиксированных таблиц в JSON или в отдельных полях?

    mayton2019
    @mayton2019
    Bigdata Engineer
    JSON хорошо подходит для хранения неспецифицированных данных. Например у вас есть таблица товаров.
    У товара есть базовые свойства такие как цена, категория, название и производитель.
    А есть описалово товара где например для ТВ-панели будет около 50 параметров таких как диагональ,
    яркость матрицы, и прочая техническая чепуха. Вот эти 50 параметров можно положить в JSON (или JSONB)
    для Postgres. Потому что в магазине всегда есть прецензиозные клиенты которым нужна посудомойка розового цвета и встраиваемая и еще ценой такой-то и такой-то. Вот спецом для них такая структура может быть создана.

    Поэтому ответ тут может быть такой. Эти две техники не исключают друг друга. Вы можете использовать
    классическую таблицу с полями и +дополнительно иметь сет неспецифицированных полей.
    Ответ написан
    Комментировать
  • Почему нельзя/можно писать бизнес-логику в sql?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можно. Весь 20-й век почти так делали. База была главной. Эдакая себе царица. Ее любили. Холили.
    Приложения были двухзвенки. Оконная апликуха коннектилась к базе и все расчеты
    проводились в базе. Апликуха только показывала результаты в гридах и вводила формочки.
    Джобы тоже запускались в базе как процедуры на PL/SQL по скедулеру. Для пуска их клиент
    был тоже не нужен. Плановые задачи БД запускала самостоятельно. Это и было видение
    бизнес логики из 20-го века.

    В 21-м веке с развитием веба появился слой middle. И разработчики вынесли в него максимальную
    часть логики. Это произошло естественным путем. А базе досталась участь быть просто хранилищем
    таблиц. Потому что держать 2 копии логики или поддерживать было уже неудобно. В команде
    должен быть тогда разработчик и Java и PL/SQL одновременно. В современной парадигме
    разработки с ORM база стала просто чем-то вторичным. И на уровне ORM абстракций
    даже заменяемым на другие типы баз.

    Но не все так плохо.

    Фактически, логика современного приложения размазана по 3м слоям. Даже в браузере
    есть какая-то минимальная логика, например при аутентификации или при проверке
    валидности емейла. И какая-то логика агрегации (sum/group by) полюбому есть в базе.
    Потому что агрегировать в приложении все - глупо. Это лишний трафик.

    И нет такого архитектора который говорит "нельзя". Просто есть best-practices современной разработки,
    исходя из развитя железа, сетей и вообще рынка всего остального. Кто знает может в мобилах вернуться
    к двузвенкам. Смотря под каким углом смотреть на современные мобильные приложения? Who knows.
    Ответ написан
    2 комментария
  • Какую базу данных посоветуете для решения проблемы?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ну... SQLIte это простая DBMS, расчитанная на однопользовательскую работу и короткий тип
    транзакций (OLTP).

    Для много-пользовательской нужен посредник. Его можно называть connection pool или как будет
    угодно, но он должен быть в одном экземпляре чтобы эксклюзивно работать с БД с а с другой стороны
    предоставлять много-пользовательский доступ к самому себе. Тоесть к посреднику. Таким образом
    проблема уходит из SQLite и приходит в ваш язык программирования.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    как тогда работают БД?

    Пускай Ораклисты меня поправят но по моему DBMS Oracle не использует потоки. По крайней мере
    на уровне терминологии и документации все составные части Oracle - это процессы PMON, SMON, DBW...
    И пользовательские сессии тоже представлены процессами. По крайней мере отстрел пользовательских
    сессий через orakill / kill тоже привязан архитектуре процессов.

    или у БД своя файловая система?

    Да Oracle может использовать ФС ext3/4 например или работать поверх технологии ASM (это 2-в-1 и менеджер
    томов и кластерная ФС) но мне кажется что к сути вопроса это не относится.

    По старой памяти у меня в голове крутится параметр FILESYSTEMIO_OPTIONS, он отвечает за тип I/O
    операций которые DBMS будет использовать. Там кажется ASYNC, DIRECT и их комбинации. Вобщем
    почитай тоже по этому вопросу.
    Ответ написан
    Комментировать
  • Производительность структуры базы данных для игры?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Как в такой схеме реализуются связи?

    Обычно в игровой логике избегают использования SQL систем из-за unpredictable времени
    отклика. Тоесть если в финансовой системе вы можете подождать секунд 5 или минутку
    обработки транзакций то внутри игры игрок быстро заскучает и выйдет из игры.

    Поэтому в играх обычно используют NoSQL системы (наподобие RocksDb, Cassandra)
    но в них доступ идет только по ключу. Key-Value и никакие JOINS не работают.

    Если сильно хотят подружить игру с платежной системой - то заводят отдельный сервер
    для денежных операций (он может быть под SQL БД) но события между игрой и платежной
    системой гоняют по очередям (MQ) чтоб не было нигде блокирующих операций.

    Поэтому твой вопрос по сути - это квест. Типа пойдешь на право - перформанс потреяшь
    или пойдешь налево - вырастет денормализация и аномалии в БД.
    Ответ написан
  • Где лучше сохранить информацию о посетителей сайта?

    mayton2019
    @mayton2019
    Bigdata Engineer
    При данной постановке - безразлично где хранить. Можешь их писать в текстовый файл в формате даты + IP адреса.
    Можешь писать в БД. Никто не скажет где здесь оптимум.

    Пока ты сам не придумаешь какие запросы будут по этому хранилищу. И как долго ты согласен ждать выдачи
    ответа. Вот с этого момента уже можно обсуждать Базы или форматы бигдаты.
    Ответ написан
    5 комментариев
  • Есть ли бесплатная база данных с фильмами?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В мире существует огромное количество баз с фильмами где лежит мета-дата.
    Это сведенья об актерах, аннотоции, рецензии и технические подробности релиза и рейтинги прокатов.
    Вот когда-то я качал отсюда например https://developer.imdb.com/non-commercial-datasets/
    Поищи в kaggle и google базах по машинному обучению. Там тоже есть метадата. Но вся она
    не стандартизирована. Разрозненна. И тебе предстоит работа дата-инженера в попытках
    хотя-бы привести это все к общему знаменателю
    . Справочники везде будут разные
    и модель нормализации вообще бывает разная. Кроме того эти базы ведут конкретные
    люди, которые ведут их в системе ценностей запада и США и поэтому их взгляд на
    содержимое будет вполне себе понятным. Тоесть объективной базы или объективной
    аннотации без купюр или без повестки будет найти почти невозможно.

    Сами фильмы - это платная услуга и скорее всего такого ты не найдешь нигде.
    А если где-то и найдешь - это обычно быстро закрывают. Может у соседа по дому
    есть росшаренная папка Windows. Как вариант.

    Если просто скроллить ленту rutor то можно найти неплохие релизы новых фильмов
    но как по мне - там больше шир-потреб или что-то очень старое и ненужное. Рутор
    неплох но очень мало чего я для себя там находил. Ну там Comedy Club можно было найти.

    Еще в телеграм канале внезапно стали появляться ленты с аносами и линками на сами фильмы
    но я таких советовать тут не буду (понятное дело). Кроме того они живут как бабочки-мотыльки.
    Несколько дней и потом внезапно закрываются.
    Ответ написан