Ответы пользователя по тегу Базы данных
  • Индекс в субд это по сути отдельная таблица?

    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 или можно
    делать анализ крашей и аварий.
    Ответ написан
    Комментировать
  • Как выбрать базу данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Есть такая старая поговорка из тайм-менеджмента - "что СРОЧНО - то не важно".

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

    А есть вообще такой? Мне сложно себе представить. Если это биг-дата со стримингом - то там надо использовать не постгрес а другие системы. Kafka+Spark например. Но я не буду давать таких советов потому что люди обычно сидят на консервативных системах типа реляционок и хотят делать на них все. Просто им так удобнее.

    Давайте немного арифметики. Если мы формируем 10к в секунду то за сутки у нас набегает 10000L * 60 * 60 * 24 = 864 000 000 или восемьсот миллионов строк. Это вот если загрузка будет постоянно такая.
    Ответ написан
    Комментировать
  • Как обеспечить консистентность данных между БД и поисковым движком?

    mayton2019
    @mayton2019
    Bigdata Engineer
    В любой информационной системе я-бы выделял single-source-of-truth (типа главный источник правды) и этот главный источник должен быть согласован сам с собой всегда. Будет ли это дисковый файл. Kafka, или база PG - неважно. Важно что он будет арбитром в спорных ситуациях.

    В ситуации с потерей электричества что вы описали - совершенно невозможно правильно восстановить обе системы. Одна из ник полюбому будет опережать другую. В high-load системах она будет опережать не на 1 на на сотню транзакций например. Честно я даже не могу придумать алгоритм восстановления. Особенно если часы где-то разошлись на милисекунду и одна из систем сделала update на уже вставленные данные.

    Мне нравится вариант когда мы сразу пишем информацию в Postgres и делаем commit (по правилам которые нужны бизнесу) и дальше уже индексируем содержимое базы эластиком. После аварийного ребута я будут знать что PG содержит именно то что было закоммичено. То что нужно тоесть. Эластик будет просто догонять.
    Ответ написан
    Комментировать
  • В чем принципиально различие postgres от mysql?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Postgresql - более консервативен. Его можно брать почти для любых проектов. Есть partitioning что свидетельствует о зрелости системы и об Enterprise-ready. Единственное что может быть не очень - это некий кумулятивный эффект от частых inserts/updates который требует вакуума. И со счетчиками транзакций там есть нюанс. Но скорее всего в твоём сегменте разработки PHP/Laravel - тебе будет просто безразлично сущестование вакуума.

    MySQL это лейбл под которым на самом деле могут работать различные engines таблиц. И если анализировать какой-то performance-инцедент то нужно в первую очередь спрашивать с какой опцией таблица создавалась. MyISAM/Innodb/e.t.c. Потому что выбор этого двигателя влиял на какие-то опции скорости и транзакций. Я заменял например в создающих скриптах InnoDb на MyISAM для того чтобы просто быстрее прогрузить 1Тб CSV файл.

    В более современных версиях типа MariaDb (я уже не следил за этими новостями) есть более умные двигатели которые учитывают дефекты старых и по идее они должны быть универсальнее. Тоесть можно их брать смело.

    Что лично меня раздражает в диалекте My/SQL - так это странного вида кавычки-апострофы. Никогда не понимал зачем это.
    Ответ написан
    Комментировать
  • В чем отличие реляционных от нереляционных БД?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Я думаю что главное отличие - это способность осуществлять соединения (JOINS) по любому полю.

    Попробуйте сджойнить две таблицы Cassandra по любому полю. Хрен вам. Это считается неверным дизайном. С точки зрения идеологии Cassandra вы должны были дизайнить модель так чтобы таких джойнов (или таких мыслей) у вас никогда не возникало. Грубо говоря - хотите какую-то выборку - подготовьте ее заранее на уровне архитектуры. Типа мат-вью.

    Да что там джойн. Там даже выбрать по предложению WHERE не всегда можно. Тоже считается антипаттерн. В базовом SQL синтаксисе это не сработает. Надо добавлять опцию allow filtering что как-бы говорит нам - что мы вышли за рамки обычного запроса. Захотели птичьего молока...

    А вот для Oracle/PG/Mysql/MSSQL - получить джойн по любому полю с любым - сущий пустяк. Хотя дать смысл этому джойну будет сложнее. Джойнить величины с величинами.

    Хотя в последнее время различия между реляционными и прочими - стираются. Это как парадигмы в ЯП. Лет 20 назад все говорили о парадигмах. Сейчас - многие языки считаются мультипарадигменными. Тоесть спор сам по себе закрыт на уровне определения.
    Ответ написан
    Комментировать
  • Как реализовать указание полного адреса из заранее подготовленной базы данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Оставь только почтовый индекс обязательным. Всё остальное - пускай текстом запишет как есть.
    Ответ написан
    Комментировать
  • Какие существуют бесплатные базы данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для заметок база данных не нужна.

    Я использую git для заметок и когда надо синхронизировать десктоп и ноутбук - делаю соотв pull/push.

    Всё что бесплатное - либо действует 30-60 дней пробного периода. Кроме того никак не помогает вам в решение технических issues. Бесплатный пользователь облаков - это бета-тестер. Не обижайтесь если внезапно версия обновиться без вашего ведома. Чтоб не было сюрпризов вобщем.
    Ответ написан
    1 комментарий
  • Есть ли быстрое хранилище с возможностью подписаться на обновления?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Если честно у меня - путаница. Трекеры и клиенты - это одни и те-же сущности?

    Kafka - хорошая штука но она любит грамотный дизайн топиков. Какой здесь будет маппинг? Если клиентов - 100 мильонов то вряд-ли кафка выдержит столько-же топиков. Если топик делать один на все события - то нужно как-то партицировать по признакам. По каким?

    Вобщем мало информации. Нужны диаграммы и цифры. Без них такого решения как кафка - нельзя принимать. Иначе это будет просто... безответственно. Тоесть мы посоветовали кафку а дальше - бейся сам как хочешь.
    Ответ написан
    6 комментариев
  • Различные варианты database cloud?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Для разработчика ты можешь поднять Postgres, Redis, Mongo в Docker. Это делается (почти) в 1 строку.
    Или если тебе нужен ансамбль из нескольких сервисов тогда - kubernetes.

    Облачные провайдеры дают бесплатный аккаунт только на 1-2 месяца а потом все равно надо платить. Кстати при глубоком изучении тех-же AWS/Azure/GCP я все таки советую оплатить акк. Я замечал что есть некоторая часть проблем которая принципиально не устраняется в бесплатных учетках.
    Ответ написан