Чем отличается субд oracle от cassandra
пространство ключей (например, база данных в реляционных базах данных) и поддержка многих семейств столбцов или таблиц (таких же, как таблица в реляционных базах данных) и неограниченных строк.
из тегов Stackoverflow:
широкое хранилище столбцов-это тип базы данных ключ-значение. Он использует таблицы, строки и столбцы, но в отличие от реляционной базы данных, имена и формат столбцов может меняться от строки к строке в одной таблице.
в Cassandra все строки (в таблице) должны иметь ключ строки, тогда каждый ключ строки может иметь несколько столбцов. Я читал о различиях в реализации и хранении данных реляционной базы данных и NoSql (Cassandra) .
но я не понимаю разницы между структуру :
представьте себе сценарий, в котором у меня есть таблица (или столбца семья в Кассандре):
когда я выполняю запрос (Cql), как это :
это дает мне результат, как вы можете увидеть :
поэтому я выполняю приведенный выше сценарий в реляционной базе данных (MsSql) с запросом blow :
Я знаю, что Кассандра поддерживает динамический столбец, и я могу выполнить это, используя sth, как:
но он доступен в реляционной модели для пример в mssql вышеуказанный код также может быть реализован. Sth как :
Я вижу, что первый выбор и второй результат выбора одинаковы. В Cassandra они просто дают ключ строки (lastname) как автономный объект, но он такой же, как уникальное поле (например, ID или текст) в mssql (и всех реляционных базах данных), и я вижу, что тип столбца в Cassandra статичен (в моем примере varchar ) в отличие от того, что он описывает в теге Stackoverflow.
Итак, мои вопросы :
есть ли какое-либо недопонимание в моем воображении о Кассандре?!
так что же отличается между двумя структурами ?! Я покажу вам результат тот же.
есть ли какие-либо специальные сценарии (например, Json), которые не могут быть реализованы в реляционных базах данных, но Cassandra поддерживает ?( Например, я знаю, что вложенный столбец не поддерживает в Cassandra.)
мы должны рассмотреть более сложный пример, чтобы увидеть разницу :)
- термин семейства столбцов использовался в более старом API бережливости
- в новом CQL API, используется таблица терминов
таблица определяется как"двумерное представление многомерного семейства столбцов".
термин "широкие строки" был связан в основном с API бережливости. В cql он определен немного по-другому, но под ним выглядит одинаково.
сравнение SQL nad CQL. В SQL таблица представляет собой набор строк. В простом примере это выглядит так, как в CQL это то же самое, но это не так. Таблица CQL-это набор разделов, где каждый раздел может быть только одной строкой (например, если у вас нет ключа кластеризации) или несколькими строками. Раздел, содержащий несколько строк, находится в экономной терминологии с именем "wide-row". Чтобы узнать, как он хранится внизу, прочитайте, например, часть о составных ключах из здесь.
есть больше различий:
- CQL может иметь статические столбцы, которые хранятся на уровне раздела-it кажется, что каждая строка в разделе имеет общее значение, но на самом деле это одно значение, хранящееся на верхнем уровне. Его можно также использовать для моделирования отношений 1:N
- в CQL вы можете иметь столбцы типа коллекции-set, list, map
- столбец может содержать определенный пользователем тип (вы можете определить, например, address как тип, и повторно используйте этот тип в много мест), или собрание может быть коллекция пользовательских типов
- но также CQL не поддерживает соединения, которые доступны в SQL, и вы должны очень тщательно структурировать свои таблицы, так как они должны будьте строго ориентированы на запрос (в cassandra вы не можете запрашивать данные значение столбца, вторичные индексы также имеют много ограничений). Это обычно говорят, что в реляционной модели вы четко моделируете таблицы на основе по данным, когда в cassandra вы моделируете на основе запросов.
надеюсь, мне удалось сделать это немного более ясным для вас. Я рекомендую смотреть некоторые видео (или читать слайды) из Datastax Основные Понятия Курс как твердое введение в Кассандру.
по моему опыту CQL вводит в заблуждение многих людей. Прежде всего, вы никогда не захотите сделать:
выберите * из a_table_here;
в производственном кластере Cassandra, так как вы накладываете огромную нагрузку на свой узел координатора для агрегирования всех данных со всех других узлов. Также по умолчанию вам будет возвращено максимум 10000 "строк".
чтобы понять, как Кассандра хранит ваши данные, нам нужно сначала установить несколько условий:
есть первичный ключ, в вашем случае "lastname", это хэшируется, чтобы определить, какой узел в кластере владеет этим диапазоном, и он хранится там (плюс любые узлы реплики).
далее есть столбцы кластера, я не знаю, есть ли у вас в вашем примере,но вы определяете их как первичный ключ ((фамилия), возраст, город). В этом примере кластеризации по возрасту первого, то город, это приказал.
теперь для упрощенного представления высокого уровня Кассандры для вашего использования случай, он хранит данные как карта к приказанному Multimap:
Меня зовут Миша Бутримов, я хотел бы хотел немного рассказать про Cassandra. Мой рассказ будет полезен тем, кто никогда не сталкивался с NoSQL-базами, — у нее есть очень много особенностей реализации и подводных камней, про которые нужно знать. И если кроме Oracle или любой другой реляционной базы вы ничего не видели, эти вещи спасут вам жизнь.
Чем хороша Cassandra? Это NoSQL-база данных, cпроектированная без единой точки отказа, которая хорошо масштабируется. Если вам нужно добавить пару терабайт для какой-нибудь базы, вы просто добавляете ноды в кольцо. Расширить ее на еще один дата-центр? Добавляете ноды в кластер. Увеличить обрабатываемый RPS? Добавляете ноды в кластер. В обратную сторону тоже работает.
В чем еще она хороша? В том, чтобы обрабатывать много запросов. Но много — это сколько? 10, 20, 30, 40 тысяч запросов в секунду — это немного. 100 тысяч запросов в секунду на запись — тоже. Есть компании, которые говорили, что они держат 2 млн. запросов в секунду. Вот им, наверное, придется поверить.
И в принципе у Cassandra есть одно большое отличие от реляционных данных — она вообще на них не похожа. И об этом очень важно помнить.
9. Redis
Особенности
- Линейная масштабируемость.
- Быстрое время отклика.
- Поддержка MapReduce и Apache Hadoop.
- Максимальная гибкость.
- P2P архитектура.
Когда выбирать графовые СУБД
Точно стоит обратить внимание на графовые СУБД, если строите какое-то подобие социальной сети, или реализуете систему оценок и рекомендаций. Ну и во всех случаях когда вы хорошо понимаете что такое графы, и для чего это нужно.
Когда выбирать СУБД ключ-значение
10. Elasticsearch
Легко масштабируемая поисковая система корпоративного уровня с открытым исходным кодом. Благодаря обширному и продуманному API обеспечивает чрезвычайно быстрый поиск, работает в том числе с приложениями для обнаружения данных. Используется такими компаниями, как Википедия, The Guardian, StackOverflow, GitHub. ElasticSearch позволяет создавать копии индексов и сегментов.
Особенности
- Поддержка табличных пространств, а также хранимых процедур, объединений, представлений и триггеров.
- Восстановление на момент времени (PITR).
- Асинхронная репликация.
Итоги
Важное замечание – не пытайтесь сразу все задачи решить в рамках одной СУБД. Это более чем нормально иметь несколько разных типов СУБД. Так же, не пытайтесь сразу определиться с производителем СУБД, или связать свою жизнь с одним конкретным брендом.
При выборе типа СУБД следует, прежде всего, исходить из типа решаемых задач, типов обрабатываемых данных, перспектив роста и масштабирования.
Обращайте так же внимание на популярность и наличие широкого круга разработчиков и средств разработки – это даст вам возможность, при необходимости, найти ответ на возникший вопрос быстро.
В данной статье я намеренно не делаю акцент на выбор между облачными и on-premise решениями - эта тема одной из следующих статей.
Итак, в таблице представленной ниже, кратко собрано то, что описано выше в статье.
Тип СУБД
Когда выбирать
Примеры популярных СУБД
Нужна транзакционность; высокая нормализация; большая доля операций на вставку
Oracle, MySQL, Microsoft SQL Server, PostgreSQL
Для хранения объектов в одной сущности, но с разной структурой; хранение структур на основе JSON
CouchDB, MongoDB, Amazon DocumentDB
Задачи подобные социальным сетям; системы оценок и рекомендаций
Neo4j, Amazon Neptune, InfiniteGraph, InfoGrid
Хранилища данных; выборки со сложными аналитическими вычислениями; количество строк в таблице превышает сотни миллионов
Vertica, ClickHouse, Google BigTable, Sybase \ SAP IQ, InfoBright, Cassandra
Надеюсь данная статья оказалась полезной.
В следующих статьях посмотрим на выбор между облачными и on-premise СУБД, платными и бесплатными, и многое другое.
Что ж, NoSQL сейчас модное слово, поэтому я изучал его. Я еще не разобрался с ColumnFamilies, SuperColumns и т. Д. Но я смотрел, как отображаются данные.
После прочтения этой и других статей кажется, что данные отображаются в формате, подобном JSON.
Формат РСУБД будет:
Если я правильно понимаю и мои приведенные выше примеры верны, почему я должен предпочесть дизайн РСУБД дизайну NoSQL? Лично я предпочел бы работать со структурой JSON . Значит ли это, что я должен выбрать NoSQL, а не, скажем, MySQL?
Думаю, я спрашиваю: «Когда мне выбрать NoSQL вместо РСУБД?»
Кстати, как я уже сказал, я до сих пор не совсем понимаю, как реализовать базу данных Cassandra. Т.е. как мне создать указанную выше таблицу Users в новой базе данных? Любые руководства, документация и т. Д., На которые вы могли бы указать, были бы замечательными. Мой гугл не очень сильно изменился с точки зрения "начинать с нуля" .
Если вы работаете в Google, то, возможно, вам будет проще использовать NoSQL, чем СУБД. Поскольку это не так, многие преимущества, которые предоставляет РСУБД, вероятно, будут вам полезны. Примечательно, что на одном узле NoSQL не дает абсолютно никаких преимуществ перед РСУБД. Однако реляционные СУБД обладают множеством преимуществ перед NoSQL. кто они такие?
РСУБД используют довольно глубокую магию для понимания данных, которыми они владеют, и данных, которые вы запрашиваете, таким образом, чтобы они могли возвращать эти данные наиболее эффективным способом. Если вы не спросили о каком-то столбце, rdbms не тратит усилий на его получение. Если вас интересуют строки, которые имеют общие поля в двух таблицах (это соединение, кстати), СУБД не обязательно проверять каждую пару строк на совпадения, или то, что обычно делает база данных NoSQL, просто дает вы все и заставляете вас проверять. с помощью СУБД вы обычно можете создавать запросы, которые на самом деле относятся к данным, которые вы используете, например, «если дата вторник», и если ваши индексы поддерживают это (если вы выполняете этот запрос много раз, вы должны добавить такой index) вы можете эффективно получить эти строки.
«Примечательно, что на одном узле NoSQL не дает абсолютно никаких преимуществ перед РСУБД. Однако реляционные СУБД обладают множеством преимуществ перед NoSQL. кто они такие?' - erm Нет. Один пример: время записи в MongoDB значительно быстрее, чем время записи на сервер MS SQL. Немного вводит в заблуждение утверждать, что преимуществ нет. Возможно, он не подходит для этой цели, но если вам нужна скорость, в этом есть преимущество.
Да, без схем - другое дело. Вопрос действительно в том, почему это должно быть хорошо? Я немного подозрительно отношусь к установке без схемы. Теоретически это упрощает внесение изменений. На уровне базы данных это, безусловно, имеет место, вам не нужно зацикливаться на добавлении или удалении свойств на этом уровне. С другой стороны, это никоим образом не облегчает семантические последствия миграции базы данных. Как правильно поступать при обработке полей, которые могут быть нулевыми? Бестактность нисколько не смягчает этого.
Основное преимущество NoSQL - горизонтальная масштабируемость и распределенное хранилище. Это означает, что вы можете иметь большое количество «узлов кластера» и писать на них параллельно. Кластер в конечном итоге обеспечит распространение изменений на другие узлы кластера (конечная согласованность).
NoSQL - это не столько SQL (термин означает «не только SQL»). Фактически, некоторые продукты NoSQL действительно поддерживают подмножество SQL. Причина, по которой формат данных отличается (JSON или список пар свойство / значение по сравнению с табличными данными): в реляционных базах данных количество столбцов (и имена столбцов) определяется в центральном месте, что не очень хорошо работает с горизонтальными масштабируемость (вам нужно будет остановить все узлы кластера для изменения схемы). Кроме того, соединения не поддерживаются в такой степени, потому что это нарушит горизонтальную масштабируемость (данные из нескольких узлов кластера могут потребовать чтения, если данные распределены).
А Oracle, DB2, SqlServer, Teradata и т. Д. Не поддерживают кластеризацию ?? По крайней мере, не раньше 1992 года.
@ Томас Мюллер: Именно поэтому так много людей говорят, что NoSQL - ПЛОХО. И он также не поддерживает объединения, и, тем самым, вызывает денормализацию и тем самым создает избыточность, которая («почти» обязательно) приводит к проблемам с согласованностью данных. Плюс плохая согласованность в конечном итоге. Если сервер выйдет из строя, он должен был записать все данные на диск, когда он сказал, что это произошло. Когда он в конечном итоге фиксирует данные на диск (но говорит, что он был зафиксирован раньше), тогда произойдут плохие вещи .
@StefanSteiger, да. Иногда эти плохие вещи не кажутся такими уж плохими, по крайней мере, вначале, и горизонтальная масштабируемость воспринимается как более важная. А иногда людям просто нравится иметь NoSQL в своем резюме, потому что это круто :-)
Базы данных NoSQl подходят для некоторых веб-сайтов, где вам не нужны транзакции или согласованность, где все, что вы делаете, представляет собой некоторые данные (но пока вы не станете действительно очень большими, они на самом деле не очень нужны).
Но если вам нужно обеспечить соблюдение финансовых правил (или других сложных правил целостности данных) или внутреннего контроля или отчетности и агрегирования данных для отчетности, вам понадобится СУБД. Готов поспорить, что даже Google использует СУБД для собственных кадровых и финансовых данных и т. Д.
Для некоторых веб-приложений вам может даже понадобиться комбинация обоих: базы данных nosql для некоторых типов информации, транзакционной реляционной базы данных для заказов и других вещей, где согласованность транзакций является обязательной.
Если вы разрабатываете веб-сайты, я думаю, что вам необходимо досконально понять оба типа баз данных и стоящие за ними потребности, прежде чем выбирать, как обрабатывать любые новые функции.
Мне кажется, что вы почти не разбираетесь в реляционных базах данных и предпочитаете делать то, что проще для вас лично, чем то, что подходит для проекта. Возможно, я неправильно это понимаю, но любой, кто никогда не использует объединения, подозревается в понимании реляционных баз данных.
Вы не выбираете между этими двумя, основываясь на том, какой из них кажется более легким для понимания или какое модное слово месяца, вы выбираете их на основе функциональности, которая вам понадобится, не только для пользовательского интерфейса, но и для административных задач, отчетности, финансовых или другие виды аудита данных, государственное регулирование, восстановление данных в случае отказа оборудования и т. д.
Oracle RDBMS (она же Oracle Database) на первом месте среди СУБД. Система популярна у разработчиков, проста в использовании, у нее понятная документация, поддержка длинных наименований, JSON, улучшенный тег списка и Oracle Cloud.
2. MySQL
MySQL работает на Linux, Windows, OSX, FreeBSD и Solaris. Можно начать работать с бесплатным сервером, а затем перейти на коммерческую версию. Лицензия GPL с открытым исходным кодом позволяет модифицировать ПО MySQL.
Эта система управления базами данных использует стандартную форму SQL. Утилиты для проектирования таблиц имеют интуитивно понятный интерфейс. MySQL поддерживает до 50 миллионов строк в таблице. Предельный размер файла для таблицы по умолчанию 4 ГБ, но его можно увеличить. Поддерживает секционирование и репликацию, а также Xpath и хранимые процедуры, триггеры и представления.
Особенности
- Высокая производительность.
- Автоматическая фрагментация.
- Работа на нескольких серверах.
- Поддержка репликации Master-Slave.
- Данные хранятся в форме документов JSON.
- Возможность индексировать все поля в документе.
- Поддержка поиска по регулярным выражениям.
5. MongoDB
Самая популярная NoSQL система управления базами данных. Лучше всего подходит для динамических запросов и определения индексов. Гибкая структура, которую можно модифицировать и расширять. Поддерживает Linux, OSX и Windows, но размер БД ограничен 2,5 ГБ в 32-битных системах. Использует платформы хранения MMAPv1 и WiredTiger.
Графовые СУБД
Графовые СУБД - специфичный тип, предназначены для работы с графами, с их узлами, свойствами, и произвольными отношениями между узлами.
Очень простой пример, это организация связей в различного типа социальных сетях, где нужно хранить связи между пользователями (узлами) по разным критериям (родственные связи, коллеги, общие интересы).
Известные представители этого типа субд - Neo4j, Amazon Neptune, InfiniteGraph, InfoGrid.
Особенности DB2 11.1
- Улучшенное встроенное шифрование.
- Упрощённая установка и развёртывание.
7. Microsoft Access
Система управления базами данных от Microsoft, которая сочетает в себе реляционное ядро БД Microsoft Jet с графическим интерфейсом пользователя и инструментами разработки ПО.
Когда не выбирать колоночные СУБД
Учитывая специфику колоночных СУБД, будет не эффективно ее использовать, если выборки достаточно простые, параметры выборки статичны, и если преобладают выборки по ключевым значениям. Так же, если количество строк в таблице, из которой делается выборка, меньше сотен миллионов строк, то скорее всего не будет большого преимущества, по сравнению с реляционной СУБД.
Нужно так же иметь ввиду, что в колоночных СУБД могут быть и другие ограничения. Например, может отсутствовать поддержка транзакций, а язык запросов может отличаться от классического SQL, и прочее.
В любой непонятной ситуации создавай новую таблицу
Если мы хотим иметь возможность доставать пользователей по ID или по возрасту, или по зарплате, что делать? Ничего. Просто использовать две таблицы. Если надо будет доставать пользователей тремя разными способами — таблиц будет три. Прошли те времена, когда мы экономили место на винте. Это самый дешевый ресурс. Он стоит гораздо дешевле, чем время ответа, которое может быть губительным для пользователя. Пользователю гораздо приятнее получить что-то за секунду, чем за 10 минут.
Мы обмениваем излишнее занимаемое место, денормализованные данные на возможность хорошо масштабироваться, надежно работать. Ведь на самом деле кластер, который состоит из трех дата-центров, в каждом из которых по пять нод, при приемлемом уровне сохранения данных (когда точно ничего не потеряется), способен пережить гибель одного дата-центра полностью. И еще по две ноды в каждом из двух оставшихся. И вот только после этого начнутся проблемы. Это довольно хорошее резервирование, оно стоит пары-тройки лишних ssd-накопителей и процессоров. Поэтому для того, чтобы использовать Cassandra, которая ни разу не SQL, в которой нет отношений, внешних ключей, нужно знать простые правила.
Проектируем все от запроса. Главными становятся не данные, а то, как приложение собирается с ними работать. Если ему нужно получать разные данные разными способами или одни и те же данные разными способами, мы должны положить их так, как будет удобно приложению. Иначе мы будем проваливаться в Full Scan и никакого преимущества Cassandra нам не даст.
Денормализовать данные — это норма. Забываем про нормальные формы, у нас больше не реляционные базы. Положим что-нибудь 100 раз, будет лежать 100 раз. Это все равно дешевле, чем стормозить.
Выбираем ключи для партиционирования так, чтобы они нормально распределялись. Нам не нужно, чтобы хэш от наших ключей попадал в один узкий диапазон. То есть, год рождения в примере выше — плохой пример. Вернее, он хороший, если у нас пользователи по году рождения нормально распределены, и плохой, если речь идет об учениках 5-го класса — там не очень хорошо будет партиционироваться.
Сортировка выбирается один раз на этапе создания Clustering Key. Если ее нужно будет изменить, то придется переливать нашу таблицу с другим ключом.
И самое важное: если нам нужно 100 разными способами забрать одни и те же данные, значит у нас будет 100 разных таблиц.
Заметил, что когда спрашиваешь кого-нибудь, особенно на собеседовании, какие типы СУБД существуют, то первое что вспоминают многие – это реляционные базы данных, и NoSQL, а вот про разновидности часто забывают или не могут сформулировать их отличие. Поэтому начнем с простого перечисления наиболее используемых.
Тем, кому не хочется долго читать, может сразу перейти на итоговую таблицу .
Нужно обязательно сделать ремарку, что некоторые крупные производители, имеют в своем арсенале несколько типов СУБД, как в виде отдельных продуктов, так и в виде внутренней реализации. Например, у Oracle на самом деле чего только нет, начиная с классической реляционной СУБД, продолжая с отдельным продуктом Oracle NoSQL Database, который может использоваться и как документная, и как колоночная, и как ключ-значение. Отдельное решение от того же Oracle, Autonomous Data Warehouse – это уже специализированное решение для хранилищ данных. Еще один отдельный продукт от Oracle – Oracle Graph Server для работы с графами, и еще много другого. Этому можно посвятить отдельную серию статей.
Особенности
- Высокая производительность.
- Зависимость от платформы.
- Возможность установить разные версии на одном компьютере.
- Генерация скриптов для перемещения данных.
NoSQL-базы данных
Когда не выбирать СУБД ключ-значение
Если вы предполагаете хранить в базе данных много сущностей (таблиц), а у сущностей будут сложные структуры с разными типами данных. Так же, если вы предполагаете делать из этой таблицы сложные запросы которые возвращают множества строк.
СУБД типа ключ-значение
Наверное один из самых простых типов СУБД. В упрощенном виде, это некая таблица с уникальным ключом и собственно связанным с ним значением, в котором может быть что угодно. Чаще всего такие СУБД используют для кэширования, т.к. они очень быстро работают, а это и не сложно, когда есть уникальный ключ, и запрос возвращает только одно значение. У некоторых представителей данных СУБД есть возможность работать полностью в памяти, а так же есть возможность задавать срок жизни записи, после истечения которого, записи будут автоматически удаляться.
Наиболее известные СУБД такого типа - Redis и Memcached.
Особенности
- Масштабируемость.
- Лёгкость использования.
- Безопасность.
- Поддержка Novell Cluster.
- Скорость.
- Поддержка многих операционных систем.
4. PosgreSQL
Масштабируемая объектно-реляционная база данных, работающая на Linux, Windows, OSX и некоторых других системах. В PostgreSQL 10 есть такие функции, как логическая репликация, декларативное разбиение таблиц, улучшенные параллельные запросы, более безопасная аутентификация по паролю на основе SCRAM-SHA-256.
Задаем сортировку, накладываем ограничения
Нужно помнить, что порядок сортировки (убывающая, возрастающая, не важно) задается в тот же момент, когда создается ключ, и поменять его потом будет нельзя. Он физически определяет, как будут рассортированы данные и как они будут лежать. Если нужно будет изменить Clustering key или порядок сортировки, придется создавать новую таблицу и переливать в нее данные. С уже существующей так не получится.
Мы заполнили нашу таблицу пользователями и увидели, что они легли в кольцо сначала по году рождения, а потом внутри на каждой ноде по зарплате и по user ID. Теперь мы можем селектить, накладывая ограничения.
Появляется снова наш работающий where, and , и пользователи нам достаются, и все снова хорошо. Но если мы попробуем использовать только часть Clustering key, причем менее значимую, то Cassandra тут же ругнется, что не может в нашей мапе найти место, где этот объект, у которого вот эти поля для компаратора null, а вот этот, который только что задали, — где он лежит. Мне придется снова поднять все данные с этой ноды и отфильтровать их. И это аналог Full Scan в рамках ноды, это плохо.
Когда не выбирать документную СУБД
Не самое лучшее решение для реализации транзакционная модели, и точно не лучший вариант для формирования отчетности.
Когда не выбирать реляционную СУБД
Если предполагается хранить не структурируемые данные, или наоборот очень простые структуры типа ключ-значение, то лучше посмотреть в сторону документных СУБД и специализированных СУБД типа ключ-значение соответственно.
Так же один из признаков, что имеет смысл подумать не о реляционных СУБД, это такой факт как необходимость часто обновлять значения в одних и тех же строках. Обычно это обходится "дорого" в реляционных СУБД, и нужно применять "продвинутую магию" что бы делать это корректно.
Конечно, тут есть много «но», или «а если очень хочется», и других ситуаций, когда данные рекомендации можно игнорировать. Это нормально, особенно когда за дело берется эксперт, который знает как это сделать.
Реляционные СУБД
Начнем по порядку, классические, реляционные СУБД чаще всего используются для построения решений OLTP (Online Transaction Processing). В таких решениях СУБД работает с небольшими по размерам транзакциями, но идущими большим потоком, и при этом от системы требуется минимальное время отклика, а так же возможность, при определенных условиях, отменить любые изменения выполняемых в рамках транзакции. Если вы строите систему, в рамках которой требуется хранить значительное количество сущностей (таблиц), с различными типами связей между ними (один-к-одному, один-к-многим, многие-ко-многим), то это скорее всего про реляционные СУБД.
Наиболее известные СУБД такого типа - Oracle, Microsoft SQL, PostgreSQL, MySQL.
Особенности
- Автоматическая обработка отказа.
- Транзакции.
- Сценарии LUA.
- Вытеснение LRU-ключей.
- Поддержка Publish/Subscribe.
Не все, что выглядит одинаково, работает одинаково
Как-то ко мне пришел коллега и спросил: «Вот СQL Cassandra query language, и в нем есть select statement, в нем есть where, в нем есть and. Я пишу буквы, и не работает. Почему?». Если относиться к Cassandra как к реляционной базе данных, то это идеальный способ закончить жизнь жестоким самоубийством. И я не пропагандирую, это запрещено в России. Вы просто спроектируете что-нибудь неправильно.
Например, к нам приходит заказчик и говорит: «Давайте построим базу данных для сериалов, или базу данных для справочника рецептов. У нас там будут блюда с продуктами или список сериалов и актеров в нем». Мы говорим радостно: «Давайте!». Это два байта переслать, пара табличек и все готово, все будет работать очень быстро, надежно. И все прекрасно, пока заказчики не приходят и не говорят, что домохозяйки решают еще и обратную задачу: у них есть список продуктов, и они хотят узнать, какое блюдо они хотят приготовить. Вы мертвы.
Все потому, что Cassandra — гибридная база данных: она одновременно и key value, и хранит данные в широких столбцах. Если говорить на языке Java или Kotlin, это можно было бы описать вот так:
То есть мапа, внутри которой лежит еще и отсортированная мапа. Первым ключом к этой мапе является Row key или Partition key — ключ партиционирования. Второй ключ, который является ключом к уже отсортированной мапе, это Clustering key.
Для иллюстрации распределенности базы данных нарисуем три ноды. Теперь нужно понять, как разложить данные на ноды. Потому что если мы будем пихать все в одну (их, кстати, может быть тысяча, две тысячи, пять — сколько угодно), это не очень-то про распределенность. Поэтому нам нужна математическая функция, которая будет возвращать число. Просто число, длинный int, который будет попадать в какой-то диапазон. И у нас одна нода будет отвечать за один диапазон, вторая — за второй, n-ная — за n-ый.
Это число берется с помощью хеш-функции, которая применяется как раз к тому, что мы называем Partition key. Это тот столбец, который указывается в директиве Primary key, и это тот столбец, который будет первым и самым основным ключом мапы. Он определяет, на какую ноду какие данные попадут. Таблица создается в Cassandra почти с таким же синтаксисом, как в SQL:
Primary key в данном случае состоит из одной колонки, и она же является ключом партиционирования.
Как у нас лягут пользователи? Часть попадет на одну ноду, часть — на другую, и часть — на третью. Получается обыкновенная хэш-таблица, она же map, она же в Python — словарь, она же — простая Key value-структура, из которой мы можем читать все значения, читать и писать по ключу.
Документные СУБД
Документные или документно-ориентированные СУБД - это одна из наиболее популярных разновидностей NoSQL СУБД, где основной единицей логической модели данных является документ - структурированный текст, с определенным синтаксисом.
Иногда встречаются мнения что модель данных в документных БД похожа на модель данных в объектно-ориентированных базах данных. В этом есть доля правды, единственная реальная разница между ними заключается в том, что базы данных документов только сохраняют состояние, но не поведение.
Так же, само название "документо-ориентированная" подчас вводит в заблуждение, и мне встречались коллеги, которые считали, что это база для систем документооборота. Нет, это не так.
Интересно, что документные СУБД развиваются достаточно активно, и сейчас некоторые из них, в том числе, поддерживают проверку схемы.
Известными представителями таких СУБД являются CouchDB, MongoDB, Amazon DocumentDB.
Особенности
- Обрабатывает большие данные.
- Поддерживает SQL, к нему можно получить доступ из реляционных БД Oracle.
- Oracle NoSQL Database с Java/C API для чтения и записи данных.
Колоночные СУБД
Колоночные СУБД очень похожи на реляционные. Они так же состоят из строк, которые имеют атрибуты, а строки группируются в таблицах. Различия в логических моделях несущественные, а вот на уровне физического хранения данных различия значительные.
В реляционных СУБД данные хранятся "построчно", это означает что для считывания значения определенной колонки, придется прочитать практически всю строку, как минимум от первой до нужной колонки. В колоночной СУБД данные хранятся "поколоночно", т.е. колонка - это как отдельная таблица. Соответственно чтение будет происходить из конкретного столбца сразу. На практике это реально работает очень быстро (проверено мной на нескольких реализованных хранилищах данных).
Основные преимущества колоночных СУБД – эффективное выполнения сложных аналитических запросов на больших объемах, и легкое, практически мгновенное, изменение структуры таблиц с данными, плюс существенная компрессия и сжатие, которое позволяет значительно экономить место.
Яркие представители колоночных СУБД - Sybase IQ (ныне SAP IQ), Vertica, ClickHouse, Google BigTable, InfoBright, Cassandra.
8. Cassandra
СУБД активно используется в банковском деле, финансах, а также в Facebook и Twitter. Поддерживает Windows, Linux и OSX. Для запросов к БД Cassandra используется SQL-подобный язык — Cassandra Query Language (CQL).
3. Microsoft SQL Server
Самая популярная коммерческая СУБД. Она привязана к Windows, но это плюс, если вы пользуетесь продуктами Microsoft. Зависит от платформы. И графический интерфейс, и программное обеспечение основаны на командах. Поддерживает SQL, непроцедурные, нечувствительные к регистру и общие языки баз данных.
Когда выбирать документную СУБД
Если нужно хранить объекты в одной сущности, но с разной структурой. Если нужно хранит структуры, включая объекты, списки и словари, особенно в формате близкому к JSON.
На самом деле область применения документных СУБД очень широкая. Их можно использовать как компактную базу данных для отдельно взятого микро-сервиса, так и для вполне масштабных решений, в качестве хранилища состояний чего-либо.
Select: когда allow filtering превращается в full scan, или как не надо делать
Давайте напишем какой-нибудь select statement: select * from users where, userid = . Получается вроде бы как в Oracle: пишем select, указываем условия и все работает, пользователи достаются. Но если выбрать, например, пользователя с определенным годом рождения, Cassandra ругается, что она не может выполнить запрос. Потому что она вообще ничего не знает про то, как у нас распределяются данные о годе рождения — у нее в качестве ключа указана только одна колонка. Тогда она говорит: «Хорошо, я могу по-прежнему выполнить этот запрос. Добавьте allow filtering». Мы добавляем директиву, все работает. И в этот момент происходит страшное.
Когда мы гоняем на тестовых данных, то все прекрасно. А когда вы выполняем запрос в продакшене, где у нас, к примеру, 4 миллиона записей, то у нас все не очень хорошо. Потому что allow filtering — это директива, которая позволяет Cassandra собрать все данные из этой таблицы со всех нод, всех дата-центров (если их много в этом кластере), и только потом уже отфильтровать. Это аналог Full Scan, и вряд ли от него кто-то в восторге.
Если бы нам нужны были пользователи только по идентификаторам, нас бы это устроило. Но иногда нам нужно писать другие запросы и накладывать другие ограничения на выборку. Поэтому вспоминаем: это все у нас мапа, у которой есть ключ партиционирования, но внутри нее — отсортированная мапа.
И у нее тоже есть ключ, который мы называем Сlustering Key. Этот ключ, который, в свою очередь, состоит из колонок, которые мы выберем, с помощью которого Cassandra понимает, как у нее данные физически отсортируются и будут лежать на каждой ноде. То есть, для какого-то Partition key Clustering key расскажет, как именно данные запихнуть в это дерево, какое место они там займут.
Это реально дерево, там просто вызывается компаратор, в который мы передаем некий набор колонок в виде объекта, и задается он тоже в виде перечисления колонок.
Обратите внимание на директиву Primary key, у нее первый аргумент (в нашем случае год) всегда идет Partition key. Он может состоять из одной или нескольких колонок, это не важно. Если колонок несколько, его нужно еще раз в скобки убрать, чтобы препроцессор языка понял, что это именно Primary key, а за ним все остальные колонки — Clustering key. При этом они будут в компараторе передаваться в том порядке, в котором они идут. То есть, первая колонка более значимая, вторая — менее значимая и так далее. Как мы для data classes пишем, например, поля equals: перечисляем поля, и для них пишем, какие больше, а какие меньше. В Cassandra это, условно говоря, поля data class, к которому будет применяться написанный для него equals.
Когда не выбирать графовые СУБД
Практически во всех остальных случаях, кроме указанных выше, лучше воздержаться от использования графовых СУБД.
6. DB2
Работает на Linux, UNIX, Windows и мейнфреймах. Эта СУБД идеально подходит для хост-сред IBM. Версию DB2 Express-C нельзя использовать в средах высокой доступности (при репликации, кластеризации типа active-passive и при работе с синхронизируемым доступом к разделяемым данным).
Когда выбирать реляционную СУБД
Один из основных признаков, который говорит о том что нужно выбирать реляционную СУБД – это высокая нормализация данных. Дополнительными признаками будет необходимость обработки большого кол-ва коротких транзакций, с большей долей операций на вставку
Когда выбирать колоночные СУБД
Один из весомых аргументов за использование именно колоночной СУБД - это если вы хотите построить хранилище данных, и планируете делать выборки со сложными аналитическими вычислениями. Косвенный признак, который так же может сигнализировать о том, что имеет смысл, хотя бы посмотреть в сторону колоночных СУБД - это если количество строк, из которых делаются выборки, превышает сотни миллионов.
Особенности
- Можно использовать VBA для создания многофункциональных решений с расширенными возможностями управления данными и пользовательским контролем.
- Импорт и экспорт в форматы Excel, Outlook, ASCII, dBase, Paradox, FoxPro, SQL Server и Oracle.
- Формат базы данных Jet.
Читайте также: