Задать вопрос
Ответы пользователя по тегу Базы данных
  • Что происходит на уровне БД при группировке?

    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 по одной строчке.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    кластеризованые и некластерризованные индексы в бд это грубо говоря отдельная служебная таблица.

    Скорее всего - нет.

    Хотя кластеризация - близка к целям индексирования но я-бы сначала послушал оригинальный текст этого утверждения. А иначе получится что мы как в том анекдоте где Рабинович напевает Шаляпина.
    Ответ написан
    Комментировать
  • Как создать базу данных для анализатора?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Короче такая мысль. В этой задаче самое главное - нейронная сеть которая обучается и выдает на выходе некую модель.

    База данных здесь - вторична. Собственно здесь даже хватит текстового (csv) файла. Насколько я помню чтобы
    обучать НС нужно просто разделить выборку на две части. Обучающая 95% и контрольная 5%. И далее последовательно показывать нейросети все образцы. Для этого кейса подходит любая из известных баз. Но если делать экономно - то я-бы предложил использовать БД для измерений. Они называются time-series db. Классификатор здесь https://db-engines.com/en/ranking/time+series+dbms
    Эти БД поддерживают быструю пакетную загрузку (batch) и выборку измерений в диапазоне времени. И по тегам (по виртуальным столбцам как-бы).

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Был такой нудный дедушка Эдгар Кодд. Он как-то из соображений своей нудности взял и объявил что только он знает как правильно делать реляционные базы.

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

    Но если внутри JSON будет поле которое способно изменяться независимо от остальной части документа - то старичок Эдгар будет на вас сильно зол. Может даже вас побить.

    В наше время уже созданы специализированне БД (Mongo, CouchDb) которые плевали на нормализацию. Они расширяют и ослабляют понятия нормализации. Not-Only-SQL говорят про себя.
    Ответ написан
    Комментировать
  • Как можно удалить запись в таблице?

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

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

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Погуглил, и нашёл что все единодушно говорят, что лучше БД. ОК. Понятно. Доводы убедительны. Но возникает такой вопрос.

    Предположим, что у меня 5000 пользователей, у каждого по 100 постов, в каждом посте по 10000 символов. Размер всех постов получается 5 ГБ. Но это же огромная сумма! Хранить такое количество данных в БД как-то не очень. БД будет тормозить, всё это скажется на производительности и в конечном счёте это отразится на клиентах.

    Какой же тип хранения мне всё-таки выбрать? БД или простые файлы?

    Тут - мало входных данных. Во первых нужно собрать все кейсы работы с информацией.
    Например: Пользователь создал пост. Пользователь отредактировал пост. Другие пользователи - проголосовали.
    Пользователь удалил пост.

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

    Откровенно говоря в наше время дизайн системы на 80% идет от хостинга и от того какие цены выставляет
    хост провайдер на RDBMS и на Storage. Само хранилище может быть десятков видов. S3, Microsoft BLOB, GoogleCloud storage. И вот исходя из цен и из того какая формула биллинга - обычно и берут архитектуру.

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

    В вашем случае с постами я-бы сказал что S3 вполне себе справится. Я-бы хранил тело поста в S3 а прочую
    информацию о статусе редактирования и голосованиях - в любой реляционной БД.
    Ответ написан
  • Какую выбрать СУБД, если в день может быть более 11млн записей?

    mayton2019
    @mayton2019
    Bigdata Engineer
    11 миллионов inserts в день - это 127 в секунду. При такой нагрузке справится любая современная БД. Ну я не знаю таких чтоб не справлялись. Делайте только короткую буферизацию и batch-insert пачками по 100 - 1000 чтобы оптимизировать сетевой roundtrip.

    Есть специализированные NoSQL системы такие как RocksDb, Tarantool в которых именно много оптимизаций сделано было для быстрой вставки. Они выдерживают и во много раз быстрее.

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

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

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

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Два действия полностью противоречат друг другу.

    Оптимизирую сайт по скорости загрузки

    Добавляем индекс по полю publication


    Во время интенсивной загрузки индексы и триггеры и констрейнты мешают. Их выключают обычно.

    Вообще чтоб дальше продолжать обсуждать - надо задать много вопросов. Что вы делаете вообще? Вы 1 раз загружаете или каждый день будете загружать?

    Это одноразовый запрос
    SELECT COUNT(*)
    или будете каждый день его дёргать?

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Между ОЗУ и БД есть еще промежуточный вариант. Это различные key-value библиотеки для работы с хранением и поиском больших объемов данных. Из таковых я помню



    На самом деле их гораздо больше. Но автору и этих хватит. LevelDb создавался гуглом и под него есть разные API (C++, Java, C#). Почти все эти key-value библиотеки поддерживают 2 базовые структуры данных на диске (это HashTable, B+Tree).

    Для твоей задачи прекрасно подходит дисковая хеш-таблица.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    При десятке запросов в секунду - подходит любая БД.

    Я не знаю кейсов чтобы она (БД) почему-то не подошла. Если вы думаете что не подойдет - то напишите почему.
    Ответ написан
  • Как называется база данных фактов?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Это может называться temporal database. Когда есть дата активации объекта. Нативную поддержку темпоральности имеют Oracle, MS-SQL. С помощью темпоральности удобно трекать юридическую информацию. Например владение чем-то. Или биржевые мета-данные.

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    Есть несколько задач когда от реляционности отказываются сознательно.

    - Bigdata
    - Загрузка сырых или неспецифицированных данных для дальнейшей обработки
    - Загрузка документов имеющих нереляционную природу (XML/JSON)
    - Логгирование событий или просто запись данных из внешнего датасорса

    По такой слабо-связной базе нельзя делать JOINS но брать по ключу можно key-value или можно
    делать анализ крашей и аварий.
    Ответ написан
    Комментировать