Ответы пользователя по тегу Базы данных
  • Какую key-value БД использовать с данными в 10 млрд строк записей?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Несколько мыслей.

    1) У меня устойчивое дежа-вю. Периодически в топик заходят люди с именно этим вопросом. Разница только в количестве. Кому 1 млрд. Кому 10. Можно также поискать и слинковать эти вопросы в один большой вопрос.

    2) MySQL который указан в тегах - нормально справляется с этой задачей. Он и не такое число строк
    умеет хранить. И если взять MariaDb - там есть куча новых engines которые можно крутить для тюнинга
    именно скорости чтения. Разумеется жертвуя чем-то другим. Транзакциями и записью например.

    3) Непонятно что такое минимальное время? Если использовать дисковую БД типа MySQL то деградация времени
    поиска будет примерно зависеть от логарифма количества строк. Тоесть деградация будет но очень медленно.
    Для 10 млрд индекс по key будет содержать порядка 4-5 уровней BTree дерева. Тоесть дисковой системе
    нужно будет сделать до 5 или до 6 рандомных чтений (если нужные данные лежат в таблице). Это достаточно
    быстро для того чтобы моргнуть глазом за это время. Рандомное чтение любого блока из магнитного диска
    класса SATA-3 занимает порядка 20 милисекунд. Тоесть для 5 уровней - это 100 милисекунд. Для дисков
    класса SSD и это время можно уже считать меньше милисекунды. Точно я не знаю надо мерять.

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

    4) Непонятно зачем здесь указан Redis. Его задача не хранить 10 млрд а хранить только горячие
    ключи по котороым идет очень частый доступ. Если автор хочет In-memory хранение - то время можно
    еще сильнее улучшить. Его можно свести практически до нуля (я вангую несколько микро-секунд)
    но придется прикупить планок памяти побольше и посчитать сколько памяти
    надо для 10 млрд key/values неизвестной длины. Вообще крутить регулятор в направлении
    микро-секунд нет особого смысла т.к. другие звенья вашего стека (приложение и сеть) могут
    быть на порядки медленнее а это вообще нивелирует всю пользу от такой оптимизации.
    Ответ написан
    41 комментарий
  • Как правильно отформатировать данные из таблицы Excel перед импортом в бд?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Не надо ничего форматировать. Софт который делает процедуру импорта должен это сделать автоматически. Если не умеет - софт надо доработать. Но никаких дополнительных ручных действий над Excel делать не надо. Тем более что форматирование - это не контент.
    Ответ написан
    Комментировать
  • Как можно хранить фотографии в виде байтов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Это задача выходит за рамки баз данных. Здесь идет речь уже о языке программирования и БД.

    Вот у меня где-то есть код, который загружает BLOBS в таблицу используя Java JDBC.
    И есть код, который выгружает.
    Ответ написан
    Комментировать
  • Как правильно построить взаимодействие своей "внутренней" базы товаров с движком интернет-магазина?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Значит имеет место некий pipeline который работает в 3 фазы.

    1) Скачивание из гугло-таблиц в файлы. Здесь я предполагаю что у нас есть full-structured данные xlsx
    Тоесть таблицы и фиксированная шапка.

    2) Конверсия xlsx-csv. Ну здесь как-бы все понятно. Это можно сделать локально уже без веба.

    3) Загрузка (или merge) данных из CSV в реляционную базу данных.

    Мне кажется что интересно обсуждать только пункт (3). Потому что первый и второй - это просто задачи скачивания и конверсии без изменений. Задача чисто техническая и любой "школьник-парсильщик" это делает.
    Чисто утилитарная задача.

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

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

    Что делать если новая колонка зашла?
    Что делать если колонка изменила тип? Был int. Стал - string.
    Что делать если колонка дропнулась? Удалять ли в БД.
    Что делать если schema evolution нарушается. Был string, и пошел int. Это сужает возможности загрузки.

    Вот эти все вопросы надо ответить до разработки.

    UPD:
    Ответ написан
    4 комментария
  • Зачем именно нужны связи в бд?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нужно поговорить об аномалиях. Например в твоей системе я могу (теоретически) добавить месседж
    который не принадлежит ни одному пользователю системы. Я просто сделаю

    insert into message(9999999, -1, "Mua-haha...");

    И у меня есть пост от анонимоса который не зарегистрирован как пользователь.

    Разумеется можно полагаться на логику твоего приложения и думать что такая ситуация невозможна
    но с точки зрения БД она вполне возможна потому как родственная связь User + Message нигде не объявлена.
    И SQL позволяет это сделать.

    Чтоб поправить ситуацию надо эту связь добавить и тогда я не смогу создать фейковые посты от анонимосов.
    ALTER TABLE Message
    ADD FOREIGN KEY (userid) REFERENCES users(id);

    По умолчанию констрейнт создается с опцией restict (это было в Оракле как в Майскл - не знаю)
    и это гарантирует что невозможно также удалять родительские записи пока есть дочки.
    Для скорости ссылочные ключи всегда - индексированы.

    Рассуждать на тему вреда от аномалий - это просто терять время. Каждый владелец БД сам решает
    какие уровни строгости ему вводить. Вообще любая теория касаемая БД - по сути просто развивает
    идею строгости НФ1,2,3,4,5,6 и ссылочных ограничений.

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

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    При такой постановке задачи тебе безразлично какую NoSQL брать. Я-бы выбирал из скорости
    вхождения в API. Посмотри где более легкий для тебя API из списка например:
    - CouchDB
    - Tarantool
    - RocksDb
    - LevelDb
    на Python и бери и используй.

    Вряд-ли твоя игра достигнет каких-то технических лимитов в этих системах. Можешь брать любую.
    В NoSQL системах под нагрузкой либо канал затыкается (что почти невозможно в твоем конфиге)
    либо твой код. Но задидосить NoSQL движок почти невозможно. Юзай смело.
    Ответ написан
  • Какая есть альтернатива для lowdb?

    mayton2019
    @mayton2019
    Bigdata Engineer
    работает на node.js , без ruby, .net и тд.

    Я не согласен с такими странными требованиями. Что за религия запретила .net? Тебе нужен только nodejs-клиент к этой базе а сама база может быть написана на чем угодно. Тебя-же не смущает что nginx написан на языке С ? Как-то же node-приложения работают с ним?

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

    Посмотри https://db-engines.com/en/system/LevelDB. Это классика и обычно всем подходит. Даже в блокчейнах (кошельках) используется.

    для неё не нужен свой сервер и всё взаимодействие с ней идёт через ноду

    Скорее всего речь идет об однопользовательской файловой БД. Тут тоже leveldb подходит.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Из быстрых советов - проверь что Subdivision_ID проиндексирован.
    Ответ написан
    Комментировать
  • Что значит "знать PostgreSQL"?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Ух. Нет предела совершенству. Можно начать читать отсюда https://www.postgresql.org/docs/current/index.html

    Если спрашивают на собеседовании - то у них есть конкретная позиция или должность например DBA или разработчика. У них - очень разные задачи. Например DBA заниматеся бекапами, перформансом. Поднимает новые экземпляры БД для бизнеса. Лечит упавшие. Делает апгрейд версий софта. Вобщем поддерживает непрерывный цикл работы. Если спрашивают на разработчика (к примеру для банка) - то нужно знать режимы работы транзакций (их там 4 штуки кажется). Нужно знать и применять индексы. Оценивать когда они полезны и когда - бесполезны. Писать триггеры и хранимые процедуры. Если ты идешь разработчиком в какой-нибудь 2ГИС то будут спрашивать гео-поисковые возможности PG. Кроме того в наше время разработчик с БД работает малую часть времени. Все таки его основными языками будут Java/C# e.t.c. и фреймворки типа Hibernate. И нужно распределять усилия. Чистых БД разработчиков я уже лет 10 не видел. Поэтому стоит ли "упарываться" прямо в постгрес - ну я не знаю.

    Вобщем PG - это очень старый программный продукт с большой историей у которого есть много расширений и знать их все сразу невозможно.
    Ответ написан
    2 комментария
  • Как убрать binlog mysql?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для начал посмотри что в них внутри. Вот как тут пишут https://dev.mysql.com/doc/refman/8.0/en/mysqlbinlo...
    Может это и не ты накрутил а просто новая версия прикладного софта работает. Что-то обновляет интенсивно.
    Ответ написан
    Комментировать
  • Имеются ли общие гайды по созданию моделей данных (ERD) для Data Quality?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Не знаю каким боком ERD связано с DataQuality. Но на одной лекции я слышал что для оценки качества данных используют "ящики с усами" (box-and-whisker) и по ним смотрят выбросы. Ящик строится для каждой колонки отдельно.

    Реляционная диаграмма здесь скорее всего непричем. Статистика и маш-обучение оперирует обычно одной таблицей где есть всё.
    Ответ написан
    2 комментария
  • Как искать зашифрованные данные через like?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Обходные пути есть. Если вы ищете like 'Ив%' чтобы найти всех ивановых то создайте виртуальную
    колонку где первые две буквы от имени. И пускай она будет тоже шифрованная. Но для нее
    поиск по совпадению и будет аналогом like.

    Вобщем создайте столько шифрованных колонок сколько надо. Накладные расходы - обсудите с бизнесом.
    Дескыть вы хотели GDPR - получите и распишитесь. Если не даете нам создавать колонки - тогда мы не знаем
    как решать вопрсы вашего бизнеса. Эстимируйте в конце концов. Это все цена разработки и она должна
    быть обсуждена.
    Ответ написан
  • Что происходит на уровне БД при группировке?

    mayton2019
    @mayton2019
    Bigdata Engineer
    По разному. Я думаю что разные DBMS (SQlite, Oracle) могут по разному обрабатывать группировку.
    Правильный ответ на вопрос - посмотреть execution plan комадой
    explain (plan) select ..... group by....;
    Наперед угадать какой будет использовал алгоритм - невозможно. Как вы помните
    язык SQL - это декларативный язык который декларирует свойства результата а не метод
    которым разрабочик хочет что-то сделать.

    Oracle например имеет много conditions для исполнения группировки например:
    1) Какой оценочный объем выборки? Может ли она быть отсортирована in-memory (sort-area-size) в противном
    случая будет external sorting в TEMP tablespace.
    2) Есть-ли композитный или простой индекс по полям группировки? В этом случае будет index-scan.
    3) Требует ли запрос немедленной выдачи первой пачки (хинт +FIRST_ROWS) или можно подождать
    но получить весь объем быстрее. Это тоже влияет на выбор алгоритма.

    Это всё эвристики которые влияют на выбор окончательного алгоритма.

    И уже к сортированной выборке собственно применяется лямбда которая делает группирующую операцию
    AVG, SUM, COUNT ... e.t.c. и выдает строки курсора.
    Ответ написан
    Комментировать
  • Как себя ведет wordpress на PostgreSQL?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Хочу попробовать прикрутить wordpress на PostgreSQL в замену Mysql


    Как-то авантюрно звучит. Если сайтик маленький то все будет норм. Но я-бы предложил не класть
    все яйца в одну корзинку. И если у тебя например 4 сайта - то разложи их 2хPG + 2xMySQL
    чтобы была возможность что-то проверить.
    Ответ написан
    Комментировать
  • Как реализовать премодерацию запросов добавления/изменения в БД?

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

    Какая тут схема?
    Ответ написан
    Комментировать
  • В чем можно хранить около триллиона значений key=>value?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Давайте прикинем объем который понадобится. Что такое триллион?
    Это 12 нулей. Или 1 000 000 000 000 элементов. Какая у нас data-row?
    8 + 64 символов типа ASCII (байт подходит чтоб покрыть все символы).
    Итого 72 байта на строку. Там можно еще поужимать биты в байтах но только
    сложность повышает а большой пользы для дела не дает. Пускай будет ASCII == 1 байт.

    Вобщем такой расчет

    72000000000000 байтов на весь сегмент данных когда таблица загружена.
    Или 65 терабайт. А сколько магнитных блинов надо прикупить? Возьмем популярный магнитный
    Western Digital Purple 10TB 7200rpm 256MB WD102PURZ 3.5" SATA III при цене 290$
    Порядка 7 штук надо. Вобщем готовте котлету денег 290$ * 7 = 2030$

    По поводу DBMS. Да key-value здесь подходит. Можно начинать с LevelDb или RocksDb но у них
    расход дисковой памяти на 1 строчку может быть больше чем я посчитал. Я ведь считал эконом-эконом
    вариант в виде бинарного типизированного файла где все записи строго по 72 байта. Сколько именно
    захватит РоксДб или ЛевлДб - чорт его знает. Вряд-ли документация об этом что-то говорит.
    Но берите 1% датасета. Загружайте
    и аппроксимируйте сколько выйдет после полной прогрузкуи. Это - надежный способ оценки.
    Ответ написан
    12 комментариев
  • Где хранить логотип веб-сайта?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Веб-сайт - это набор файлов. В том числе и статический контент.
    Вот положите туда.

    UPD: В связи с вопросами читателей я даю расшифровку термина static content.
    В типичном архетипе проекта для Spring Boot WEB этим обзывается фолдер
    src/main/resources/static
    куда складывают js, css, favicon и прочие одноразовые ресурсы которые относятся
    к веб-приложению.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    AWS RDS - это те-же самые Oracle/Postgres/MySQL только запускаемые в хостингах Amazon.

    Поэтому твой вопрос слегка скомкан. Что на самом деле тебе надо? SQL DBMS которая работает в облаке? Потому что изучать это ты можешь установив локально бесплатные версии Oracle Express и других соотвественно.

    Ты работаешь с документами в Google Sheets. Каких возможностей тебе не хватает?

    Обычно (99%) когда говорят об облачных БД имеют в виду NOSQL:
    - Amazon DynamoDb
    - Microsoft CosmosDb
    - (у гугла тоже своё решение есть но я не вкурсе какое)

    У них есть сильное конкурентное преимущество в виде дешевизны хостинга, бесконечного
    размера и гарантированой пропускной способности. Тоесть оплаченной тобой пропускной
    способности.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Посмотри графовые бд: Neo4j (например).
    Покрывает все твои потребности.
    Ответ написан
    2 комментария
  • Какую выбрать бд для телеграм бота на пайтоне?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Нашел информацию, что sqlite не поддерживает многопоточность.

    Это не проблема для твоего приложения. Обеспечивай синхронизацию на уровне python и работай короткими
    операциями (OLTP). insert/update по одной строчке.

    А мультипоточность можно заказывать для долгоиграющих процессов. В боте таковых нету. Не должно быть вообще. Никогда не должно быть.
    Ответ написан
    Комментировать