Ответы пользователя по тегу Базы данных
  • Что выбрать: sqlite или redis?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можно попробовать вот эту фичу (Redis Queue)
    https://redis.io/glossary/redis-queue/

    Не должно быть "слишком долго". Как раз как хочет автор. :)
    Ответ написан
    Комментировать
  • Какую базу данных использовать для хранения метаданных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Основной use-case при работе с любыми данными это "запрос".

    Ты должен задать себе вопрос как я буду эти данные искать? По каким атрибутам?
    Например базы данных семейства key-value почти всегда всем подходят и всем нравятся
    за высокую скорость и дешевизну. Но это - только при условии что вы делаете поиск по ключевым атрибутам.
    Но вы не сможете к ним сделать агрегации (group by).

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

    Из личного опыта. Часто выбирают какую-то БД из того что человек (команда) уже раньше
    с ней поработали и уже имеет опыт. И такое реально было и с Ораклом и с MS-SQL. Люди их
    выбирали не потому что они хороши а чаще всего потому что "так привыкли". И десяток
    лицензий были уже давно куплены. Почему-бы не использовать. Заказчик оплатил.
    Так жить проще. Так и живут. И так строят архитектуры.
    Ответ написан
    4 комментария
  • Какие БД используют крупнейшие торговые сети для хранения заказов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я полагаю, что такие магазины сохраняют всё, например в postgres или greenplum, а затем передают в аналитические базы (или пишут параллельно), типа в кликхаус или oracle?


    XX век прошел под флагом реляционных СУБД. Вокруг них строились все системы.
    Для любой банковской системы БД - абсолютная царица дизайна. Именно от нее шло
    техническое задание. От базы а не от Хибернейта и синтетических таблиц как щас.
    Таблицы любили. Вокруг них строили красивые теории. Модели. EAV. Подгоняли
    аппарат алгебры (Эдгар Кодд со своими формочками).

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

    Какой софт использует розничная торговля - сложно сказать. Там будет десяток систем которые
    работают просто всместе как Grid. Например сообщения от кассовых аппаратов и платежных
    систем могут в первую очередь падать в JMS/MQ систему. А уже потом процесситься и ложиться в
    БД операционного дня. И по проишествии периода - сливаться Warehouse и в BigData
    Есть еще вариант что в аналитику сразу попадают данные со стриминга. Я такое видел.
    И это не последняя часть стека. Аналитика в свою очередь является источником для всяких
    BI, витрин данных. ОЛАП-кубиков и прочее что любят смотреть и показывать на презентациях.
    С красивой инфографикой.

    Что использует Магнит - чорт его знает. Это можно поискать по всяким конференциям. Но само
    знание или название продуктов вам ни о чем не скажет. Если они используют допустим
    Kafka+Clickhouse - из этого не следует что вам это пригодится.

    Были странные архитектурные решения. Uber например пытался выжать максимальные мощности
    из Postgres и не смог. Перешел на MySQL. Видимо им было достаточно MyISAM и брали лишь
    только те фичи что надо.

    Facebook строил Rocksdb (Key-Value) с очень сильной оптимизацией по диску. Там уже было
    не R+Tree а другой тип дерева. Тоже видимо у конторы так "пригорело" что им надо было
    штучную NoSQL делать.

    СБЕР по слухам строил на Apache Ignite прослойку между Ораклом и клиентами потому что Оракл
    не справлялся с нагрузками. Впрочем я не могу это нигде доказать. Просто слышал в разговорах
    архитекторов. И это очень штучное и очень деликатоное решение. Другим оно может вообще не подойдет.
    Нужно много думать о механике инвалидации кешей.

    Хедж фонд BridgeWater строит свои хранилища ассетов на базе Amazon S3. Реально эти ребята пихают
    в С3 все что можно. И в этом есть своя стратегия. S3 стоит дешево. И масштабируется. Дешевле чем DBMS.

    Также, я думаю, что множество магазинов могут быть обслуживаться отдельными кластерами, чтобы работа всей сети не остановилась, если какая та БД выйдет из строя?

    Эту задачу тоже можно решать на разных уровнях. Мне нравится решение от Cassandra. Там все
    таблицы имеют 1-2 реплики. И убить всю систему в целом в принципе невозможно пока последний
    датацентр стоит. Но Кассандра платит за это отказом от consistency и вообще она считается не-реляционкой.
    Хотя базовый диалект SQL поддерживает. Фактически она - умный NoSQL c хорошим сетевым протоколом
    обхода сбоев и конфликтов. Кажется Netflix ее активно использует.

    Вобщем можно дизайнить системы по разному усиливая одни части и ослабляя другие.
    Это как тот треугольник дешево-медленно-дорого но в углах стоят разные качества. Например
    CAP-свойства систем. Или приоритеты. Тебе что важно. Быстро записать в БД платеж? Но при этом
    чтение оперативных данных потребует лагов. Или наоборот писать медленно зато чтоб все по ящичкам
    и по коробочкам лежало да и еще в разных копиях и вариациях.
    Ответ написан
    10 комментариев
  • Как скачать базу данных JSON с Firestore (Firebase)?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Документация упоминает утилиту

    gcloud firestore export ...

    https://firebase.google.com/docs/firestore/manage-...

    Попробуй сохрани базу в файл. Если он имеет вид JSON то тебе повезло.
    Ответ написан
    Комментировать
  • Стоит ли хранить изображения base64 в БД?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Классические реляционные СУБД (MySQL) плохо приспособлены к хранению бинарных
    файлов. Все дело в размере строки. Исторически 1 строка (data_row) в БД не превышала 4-8 килобайт.
    Исходя из этого ограничения БД проектируют кеш и алгоритмы когеретности по кешу.
    И все работает отлично до тех пор пока вы не начинаете миксовать крупные файлы и строку БД.
    В этом случае мехнизм кеширования БД ломается и БД вынуждена ходить в disk (tablespace)
    который по total cost of ownership всегда стоит дороже чем обычный диск, и тем более дороже
    чем хранилище AWS/MS-Blob/GDrive. Дороже будет стоить бэкап базы данных которая на 95%
    к примеру состоит из JPG картинок вместо реляционных данных. Такова специфика дискового
    пространства почти любой БД. Не удивляйтесь если облачный биллинг вам выкатит счет
    по которому JPG картинки будут стоить как крипта. Дороже будет сетевой траф для публикации картинки
    ведь вам надо сделать сначала трансфер этих мегабайтов с хоста MySQL в Node/Tomcat/Apache
    и лишь только потом сделать еще один трансфер с веб хостинга к клиенту. Трафик - 2x.

    Поэтому имеет смысл толстые картинки положить в обычный диск под веб сервером Apache
    или пошарить хранилище через web-endpoint. В этом случае биллинг за хостинг картинок
    для вас станет хотя-бы разумным. А в реляционной базе хранить тольк URL на этот диск.
    Ответ написан
    3 комментария
  • Какой механизм лучше использовать для хранения и получения hashsum записией?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Можно использовать фильтр Блума. Тогда для твоего числа ключей (4 320 000 000) надо
    будет держать структуру размером 4.8 Гб https://hur.st/bloomfilter/?n=4320000000&p=0.01&m=&k=

    Но фильтр отбивает не 100% ответов а просто некую большую часть (99% в данной формуле). И поэтому надо чтобы
    в базе всегда стоял unique constraint. Да и вообще констрейнт - это часть культуры проектирования
    баз. Поэтому это даже не должно обсуждаться. База без гарантий уникальности - это сильно
    подпорченная информация. Информация низкого качества.

    Фильтры Блума используются в Cassandra, Hadoop, Databricks, Redis. Обычно не как основные а как
    вспомогательные структуры. Поэтому такие решения - вполне себе production-ready.
    Ответ написан
    Комментировать
  • Как правильно тестировать базу данных в .NET?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Мне не нравится сама идея тестирования базы.

    Тестируют обычно бизнес логику. Слой Services, Processors e.t.c.

    Если ваш язык программирования бизнес-логики это PL/SQL, T/SQL e.t.c. то я вам сочувствую.
    Наверное в этом и есть главная причина ваших трудностей. Эти языки неудобно тестировать
    и практики тестирования наподобие *Unit, *Property e.t.c. тестов там исторически не прижились.

    Создание тестовой БД в таком случае - да. Это компромисс. Вот и двигайте в этом направлении.
    Поднимайте все в контейнере типа docker.
    Ответ написан
    6 комментариев
  • Как запросить по 2 записи из каждой категории с лучшим рейтингом?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Кажется можно решить через оконные функции. Посмотри как тут https://dev.mysql.com/doc/refman/8.0/en/window-fun...

    Пригодится RANK или LEAD.
    Ответ написан
    1 комментарий
  • Как получить доступ до БД Azure Cosmos DB через IDE?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Устанавливай Visual Studio Code + Azure Database Extension
    Ответ написан
    Комментировать
  • Какие решения существуют для индексированного поиска по десяткам полей огромных таблиц?

    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 в через длинный сетевой стек да еще и с фиксацией транзакции это такое яростное безкомпромиссное решение
    которое не всегда и нужно.


    Договаривайтесь с ценностью бизнес-информацией и с компромиссами.
    Ответ написан
    Комментировать