Чем отличается субд oracle от cassandra

Обновлено: 05.07.2024

Итак, коротко о ключевых особенностях Cassandra:

  • реализована на Java
  • разрабатывается под эгидой Apache Foundation, бесплатная NoSQL СУБД;
  • поддерживает SQL-подобный синтаксис (CQL);
  • не поддерживает внешние ключи;
  • multimaster репликация без ограничений роста;
  • линейное увеличение производительности в зависимости от количества узлов.

MySQL является популярной СУБД для Web и, по сути, стандарт de-facto для многих проектов. О плюсах и минусах MySQL можно говорить достаточно долго. В контексте нашей задачи можно говорить о следующих особенностях:

  • сложное управление реплицируемыми кластерами;
  • плохая масштабируемость на операциях записи;
  • низкая производительность на операциях записи.

Конечно, существуют продукты, которые частично решают вышеуказанные ограничения, например, MySQL Cluster, однако, ситуация с производительностью на запись остается прежней.

Тестовая среда

Мы производили тесты в следующей тестовой среде:

  1. Экземпляр VM: Large 8 cores (Dual E5-2670), 8 GB RAM, 20GB virtio disk
  2. хранилище NFS/SSD RAID5 Adaptec 6405;
  3. Сеть хост-хранилище 10G Intel 350;
  4. Ubuntu 14.04 LVM/Ext4;
  5. Cassandra 2.0.9 с Oracle Java 7 + cassandra-driver (python);
  6. MySQL 5.5 из репозитория (INNODB, MYISAM) с модифицированным конфигурационным файлом.

В принципе, было бы интересно провести тесты и для MariaDB, но это будут тесты сравнения реализаций MySQL, а в данном случае вряд ли мы получим радикальные отличия.

Что мы тестируем

Схема таблицы Cassandra:

Схема таблиц MySQL:

Во всех тестах используется составной уникальный ключ host+user+object+when, который состоит из трех int и одного varchar.

Как мы тестируем

Мы выполняли два вида тестов:

  1. однопоточные тесты;
  2. многопоточные тесты в 4 потока.

Для Cassandra выполнялось два вида тестов:

  1. тест с асинхронным выполнением запросов (не ждем ответа от СУБД);
  2. тест с синхронным выполнением запросов (ждем ответа от СУБД).

Для MySQL так же выполнялось два вида тестов:

  1. тест с таблицей в MyISAM (statdata);
  2. тест с таблицей в INNODB (statdata2).

Перед выполнением теста все данные очищаются через TRUNCATE.

Сначала представляем результаты тестирования в один поток (вставка 900K записей):

single-thread

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

    Cassandra async: Iowait

iops60-single

В случае MySQL мы видим огромное количество IOPS на диск и значительный IOWAIT. Скорее всего упираемся в ограничение MySQL и/или дисковой подсистемы виртуальной машины (хотя IOWAIT не слишком большой, скорее всего именно MySQL). Маловероятно многопоточный тест даст лучшие результаты для MyISAM, возможно что для INNODB будет улучшение.

В случае выполнения любых тестов IOWAIT хранилища был

0%, что свидетельствует об отсутствии узких мест в системе хранения, которые бы негативно влияли на MySQL.

Представляем результаты тестирования в четыре потока:

cassandra-vs-mysql-4

cassandra-8

1500 IOPS и загружает систему на 15%, а у Cassandra загрузка и IOPS остаются на мизерном уровне. Для демонстрации возможностей приведен тест CASSANDRA-SYNC-8, в котором в хранилище пишут одновременно 8 клиентов. Как видно, он не слишком отличается от CASSANDRA-SYNC-4.

Наше предположение в том, что можно увеличивать количество клиентов, пока мы не сравнимся с CASSANDRA-ASYNC-4, потому что на этом тесте Cassandra и клиенты полностью утилизировали 8 ядер CPU.

Все журналы тестирования, конфигурационные файлы и тесты на python и shell находятся в архиве: suite

В конце можно добавить, что данные тесты покрывают только случай, когда осуществляется 100% операций вставки в базу, для понимания производительности необходимо так же провести тесты, которые комбинируют чтение и запись одновременно.

Масштабируемость

Модель хранения данных Cassandra подразумевает линейную масштабируемость системы, то есть, увеличив количество узлов в 2 раза, Вы увеличите производительность системы так же в два раза. Для обеспечения отказоустойчивости Cassandra хранит в кластерной системе обычно 3 реплики. Кроме того, линейное увеличение производительности позволяет достаточно просто планировать будущие затраты на вычислительные мощности.

Вместо заключения

Меня зовут Миша Бутримов, я хотел бы хотел немного рассказать про Cassandra. Мой рассказ будет полезен тем, кто никогда не сталкивался с NoSQL-базами, — у нее есть очень много особенностей реализации и подводных камней, про которые нужно знать. И если кроме Oracle или любой другой реляционной базы вы ничего не видели, эти вещи спасут вам жизнь.

Чем хороша Cassandra? Это NoSQL-база данных, cпроектированная без единой точки отказа, которая хорошо масштабируется. Если вам нужно добавить пару терабайт для какой-нибудь базы, вы просто добавляете ноды в кольцо. Расширить ее на еще один дата-центр? Добавляете ноды в кластер. Увеличить обрабатываемый RPS? Добавляете ноды в кластер. В обратную сторону тоже работает.


В чем еще она хороша? В том, чтобы обрабатывать много запросов. Но много — это сколько? 10, 20, 30, 40 тысяч запросов в секунду — это немного. 100 тысяч запросов в секунду на запись — тоже. Есть компании, которые говорили, что они держат 2 млн. запросов в секунду. Вот им, наверное, придется поверить.

И в принципе у Cassandra есть одно большое отличие от реляционных данных — она вообще на них не похожа. И об этом очень важно помнить.

Не все, что выглядит одинаково, работает одинаково

Как-то ко мне пришел коллега и спросил: «Вот СQL Cassandra query language, и в нем есть select statement, в нем есть where, в нем есть and. Я пишу буквы, и не работает. Почему?». Если относиться к Cassandra как к реляционной базе данных, то это идеальный способ закончить жизнь жестоким самоубийством. И я не пропагандирую, это запрещено в России. Вы просто спроектируете что-нибудь неправильно.

Например, к нам приходит заказчик и говорит: «Давайте построим базу данных для сериалов, или базу данных для справочника рецептов. У нас там будут блюда с продуктами или список сериалов и актеров в нем». Мы говорим радостно: «Давайте!». Это два байта переслать, пара табличек и все готово, все будет работать очень быстро, надежно. И все прекрасно, пока заказчики не приходят и не говорят, что домохозяйки решают еще и обратную задачу: у них есть список продуктов, и они хотят узнать, какое блюдо они хотят приготовить. Вы мертвы.

Все потому, что Cassandra — гибридная база данных: она одновременно и key value, и хранит данные в широких столбцах. Если говорить на языке Java или Kotlin, это можно было бы описать вот так:

Map<RowKey, SortedMap<ColumnKey, ColumnValue>>

То есть мапа, внутри которой лежит еще и отсортированная мапа. Первым ключом к этой мапе является Row key или Partition key — ключ партиционирования. Второй ключ, который является ключом к уже отсортированной мапе, это Clustering key.

Для иллюстрации распределенности базы данных нарисуем три ноды. Теперь нужно понять, как разложить данные на ноды. Потому что если мы будем пихать все в одну (их, кстати, может быть тысяча, две тысячи, пять — сколько угодно), это не очень-то про распределенность. Поэтому нам нужна математическая функция, которая будет возвращать число. Просто число, длинный int, который будет попадать в какой-то диапазон. И у нас одна нода будет отвечать за один диапазон, вторая — за второй, n-ная — за n-ый.


Это число берется с помощью хеш-функции, которая применяется как раз к тому, что мы называем Partition key. Это тот столбец, который указывается в директиве Primary key, и это тот столбец, который будет первым и самым основным ключом мапы. Он определяет, на какую ноду какие данные попадут. Таблица создается в Cassandra почти с таким же синтаксисом, как в SQL:

Primary key в данном случае состоит из одной колонки, и она же является ключом партиционирования.

Как у нас лягут пользователи? Часть попадет на одну ноду, часть — на другую, и часть — на третью. Получается обыкновенная хэш-таблица, она же map, она же в Python — словарь, она же — простая Key value-структура, из которой мы можем читать все значения, читать и писать по ключу.


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.

Задаем сортировку, накладываем ограничения

Нужно помнить, что порядок сортировки (убывающая, возрастающая, не важно) задается в тот же момент, когда создается ключ, и поменять его потом будет нельзя. Он физически определяет, как будут рассортированы данные и как они будут лежать. Если нужно будет изменить Clustering key или порядок сортировки, придется создавать новую таблицу и переливать в нее данные. С уже существующей так не получится.


Мы заполнили нашу таблицу пользователями и увидели, что они легли в кольцо сначала по году рождения, а потом внутри на каждой ноде по зарплате и по user ID. Теперь мы можем селектить, накладывая ограничения.

Появляется снова наш работающий where, and , и пользователи нам достаются, и все снова хорошо. Но если мы попробуем использовать только часть Clustering key, причем менее значимую, то Cassandra тут же ругнется, что не может в нашей мапе найти место, где этот объект, у которого вот эти поля для компаратора null, а вот этот, который только что задали, — где он лежит. Мне придется снова поднять все данные с этой ноды и отфильтровать их. И это аналог Full Scan в рамках ноды, это плохо.

В любой непонятной ситуации создавай новую таблицу

Если мы хотим иметь возможность доставать пользователей по ID или по возрасту, или по зарплате, что делать? Ничего. Просто использовать две таблицы. Если надо будет доставать пользователей тремя разными способами — таблиц будет три. Прошли те времена, когда мы экономили место на винте. Это самый дешевый ресурс. Он стоит гораздо дешевле, чем время ответа, которое может быть губительным для пользователя. Пользователю гораздо приятнее получить что-то за секунду, чем за 10 минут.

Мы обмениваем излишнее занимаемое место, денормализованные данные на возможность хорошо масштабироваться, надежно работать. Ведь на самом деле кластер, который состоит из трех дата-центров, в каждом из которых по пять нод, при приемлемом уровне сохранения данных (когда точно ничего не потеряется), способен пережить гибель одного дата-центра полностью. И еще по две ноды в каждом из двух оставшихся. И вот только после этого начнутся проблемы. Это довольно хорошее резервирование, оно стоит пары-тройки лишних ssd-накопителей и процессоров. Поэтому для того, чтобы использовать Cassandra, которая ни разу не SQL, в которой нет отношений, внешних ключей, нужно знать простые правила.

Проектируем все от запроса. Главными становятся не данные, а то, как приложение собирается с ними работать. Если ему нужно получать разные данные разными способами или одни и те же данные разными способами, мы должны положить их так, как будет удобно приложению. Иначе мы будем проваливаться в Full Scan и никакого преимущества Cassandra нам не даст.

Денормализовать данные — это норма. Забываем про нормальные формы, у нас больше не реляционные базы. Положим что-нибудь 100 раз, будет лежать 100 раз. Это все равно дешевле, чем стормозить.

Выбираем ключи для партиционирования так, чтобы они нормально распределялись. Нам не нужно, чтобы хэш от наших ключей попадал в один узкий диапазон. То есть, год рождения в примере выше — плохой пример. Вернее, он хороший, если у нас пользователи по году рождения нормально распределены, и плохой, если речь идет об учениках 5-го класса — там не очень хорошо будет партиционироваться.

Сортировка выбирается один раз на этапе создания Clustering Key. Если ее нужно будет изменить, то придется переливать нашу таблицу с другим ключом.

И самое важное: если нам нужно 100 разными способами забрать одни и те же данные, значит у нас будет 100 разных таблиц.

У нас в корпе база 3.7 ТБ, никто не говорит и даже не думает что это биг дата, работает все на оракле соответственно. В итоге захотелось внести ясность для себя что же это NoSQL базы и чем же они так круты для "биг даты". Хотя даже в тех же статьях пишут что для разных выборок нужно дублирование данных.

Спустя нескольких дней чтения о том что же такое NoSQL базы, какие есть и какие преимущества дают, остается ряд вопросов на которые пока нет ответа.

прежде чем погружаться в сабж., выясните как вы (ну и

Всякие модные nosql заточены больше под вставку чем под обновления.
С транзакционностью дела обстоят плохо. Можно сказать, что она "почти есть", но строго говоря ее нет.

Я бы сказал нет такого понятия как "сервер БД". Есть движок, который работает с данными.
Код может быть открытым соответственно можно дописать "листенер изменений" в роли триггера.
Поиск по словам "mongodb trigger" даст направление.

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

прежде чем погружаться в сабж., выясните как вы (ну и

Всякие модные nosql заточены больше под вставку чем под обновления.
С транзакционностью дела обстоят плохо. Можно сказать, что она "почти есть", но строго говоря ее нет.

Я бы сказал нет такого понятия как "сервер БД". Есть движок, который работает с данными.
Код может быть открытым соответственно можно дописать "листенер изменений" в роли триггера.
Поиск по словам "mongodb trigger" даст направление.

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

Интеграция с реляционной Oracle Database через внешние таблицы

Очень интересно, и Oracle noSQL так же транзакции поддерживает, очень интересно да)

если говорить языком метафор, то появление NoSQL можно сравнить с осознанием того факта, что выкинув из автомобиля руль, тормоза, и сидения можно повысить его скорость и сократить расход топлива. На протяжении нескольких недавних лет всех так завораживала перспектива этих достижений, что немножко подзабыли про то, что руль, тормоза и сидения вещи не совсем бесполезные, и их отсутствие довольно заметно снижает сферу применимости автомобиля. Сейчас идет обратный тренд, и я думаю в конечном итоге все поймут, что нереляционные технологии это вещь сильно нишевая (а никак не замена реляционным), и успокоятся. Если у вас есть большое количество бесструктурных данных, которые лучше хранить и обрабатывать хоть как-то, чем выкидывать совсем -- тогда NoSQL (Big Data) это для вас. В противном случае я бы рекомендовал просто не отвлекаться на весь этот информационный шум.

С уважением,
Николай

если говорить языком метафор, то появление NoSQL можно сравнить с осознанием того факта, что выкинув из автомобиля руль, тормоза, и сидения можно повысить его скорость и сократить расход топлива. На протяжении нескольких недавних лет всех так завораживала перспектива этих достижений, что немножко подзабыли про то, что руль, тормоза и сидения вещи не совсем бесполезные, и их отсутствие довольно заметно снижает сферу применимости автомобиля. Сейчас идет обратный тренд, и я думаю в конечном итоге все поймут, что нереляционные технологии это вещь сильно нишевая (а никак не замена реляционным), и успокоятся. Если у вас есть большое количество бесструктурных данных, которые лучше хранить и обрабатывать хоть как-то, чем выкидывать совсем -- тогда NoSQL (Big Data) это для вас. В противном случае я бы рекомендовал просто не отвлекаться на весь этот информационный шум.

С уважением,
Николай

Posted via ActualForum NNTP Server 1.5

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

Если же реально вникать смысл слов, то все получится достаточно запутанно и сложно. Во-первых, действительно, нужно как-то отделять старые нереляционные технологии (например, иерархические) от новых. Во-вторых, большинство ходовых реализаций SQL не являются реляционными в строгом смысле этого слова (там нет приведения запроса к канонической форме, допускаются дубликаты и пр.). В-третьих, NoSQLщики пытаются теперь вернуться к тем возможностям, которые предоставляют реляционные базы, и уже переосмысливают NoSQL как "not only SQL" вместо изначального радикального посыла "no SQL".

Топ-10 систем управления базами данных в 2019 году

Oracle RDBMS (она же Oracle Database) на первом месте среди СУБД. Система популярна у разработчиков, проста в использовании, у нее понятная документация, поддержка длинных наименований, JSON, улучшенный тег списка и Oracle Cloud.

Особенности

  • Обрабатывает большие данные.
  • Поддерживает SQL, к нему можно получить доступ из реляционных БД Oracle.
  • Oracle NoSQL Database с Java/C API для чтения и записи данных.

2. MySQL

Топ-10 систем управления базами данных в 2019 году

MySQL работает на Linux, Windows, OSX, FreeBSD и Solaris. Можно начать работать с бесплатным сервером, а затем перейти на коммерческую версию. Лицензия GPL с открытым исходным кодом позволяет модифицировать ПО MySQL.

Эта система управления базами данных использует стандартную форму SQL. Утилиты для проектирования таблиц имеют интуитивно понятный интерфейс. MySQL поддерживает до 50 миллионов строк в таблице. Предельный размер файла для таблицы по умолчанию 4 ГБ, но его можно увеличить. Поддерживает секционирование и репликацию, а также Xpath и хранимые процедуры, триггеры и представления.

Особенности

  • Масштабируемость.
  • Лёгкость использования.
  • Безопасность.
  • Поддержка Novell Cluster.
  • Скорость.
  • Поддержка многих операционных систем.

3. Microsoft SQL Server

Топ-10 систем управления базами данных в 2019 году

Самая популярная коммерческая СУБД. Она привязана к Windows, но это плюс, если вы пользуетесь продуктами Microsoft. Зависит от платформы. И графический интерфейс, и программное обеспечение основаны на командах. Поддерживает SQL, непроцедурные, нечувствительные к регистру и общие языки баз данных.

Особенности

  • Высокая производительность.
  • Зависимость от платформы.
  • Возможность установить разные версии на одном компьютере.
  • Генерация скриптов для перемещения данных.

4. PosgreSQL

Топ-10 систем управления базами данных в 2019 году

Масштабируемая объектно-реляционная база данных, работающая на Linux, Windows, OSX и некоторых других системах. В PostgreSQL 10 есть такие функции, как логическая репликация, декларативное разбиение таблиц, улучшенные параллельные запросы, более безопасная аутентификация по паролю на основе SCRAM-SHA-256.

Особенности

  • Поддержка табличных пространств, а также хранимых процедур, объединений, представлений и триггеров.
  • Восстановление на момент времени (PITR).
  • Асинхронная репликация.

NoSQL-базы данных

5. MongoDB

Топ-10 систем управления базами данных в 2019 году

Самая популярная NoSQL система управления базами данных. Лучше всего подходит для динамических запросов и определения индексов. Гибкая структура, которую можно модифицировать и расширять. Поддерживает Linux, OSX и Windows, но размер БД ограничен 2,5 ГБ в 32-битных системах. Использует платформы хранения MMAPv1 и WiredTiger.

Особенности

  • Высокая производительность.
  • Автоматическая фрагментация.
  • Работа на нескольких серверах.
  • Поддержка репликации Master-Slave.
  • Данные хранятся в форме документов JSON.
  • Возможность индексировать все поля в документе.
  • Поддержка поиска по регулярным выражениям.

6. DB2

Топ-10 систем управления базами данных в 2019 году

Работает на Linux, UNIX, Windows и мейнфреймах. Эта СУБД идеально подходит для хост-сред IBM. Версию DB2 Express-C нельзя использовать в средах высокой доступности (при репликации, кластеризации типа active-passive и при работе с синхронизируемым доступом к разделяемым данным).

Особенности DB2 11.1

  • Улучшенное встроенное шифрование.
  • Упрощённая установка и развёртывание.

7. Microsoft Access

Топ-10 систем управления базами данных в 2019 году

Система управления базами данных от Microsoft, которая сочетает в себе реляционное ядро БД Microsoft Jet с графическим интерфейсом пользователя и инструментами разработки ПО.

Особенности

  • Можно использовать VBA для создания многофункциональных решений с расширенными возможностями управления данными и пользовательским контролем.
  • Импорт и экспорт в форматы Excel, Outlook, ASCII, dBase, Paradox, FoxPro, SQL Server и Oracle.
  • Формат базы данных Jet.

8. Cassandra

Топ-10 систем управления базами данных в 2019 году

СУБД активно используется в банковском деле, финансах, а также в Facebook и Twitter. Поддерживает Windows, Linux и OSX. Для запросов к БД Cassandra используется SQL-подобный язык — Cassandra Query Language (CQL).

Особенности

  • Линейная масштабируемость.
  • Быстрое время отклика.
  • Поддержка MapReduce и Apache Hadoop.
  • Максимальная гибкость.
  • P2P архитектура.

9. Redis

Топ-10 систем управления базами данных в 2019 году

Особенности

  • Автоматическая обработка отказа.
  • Транзакции.
  • Сценарии LUA.
  • Вытеснение LRU-ключей.
  • Поддержка Publish/Subscribe.

10. Elasticsearch

Топ-10 систем управления базами данных в 2019 году

Легко масштабируемая поисковая система корпоративного уровня с открытым исходным кодом. Благодаря обширному и продуманному API обеспечивает чрезвычайно быстрый поиск, работает в том числе с приложениями для обнаружения данных. Используется такими компаниями, как Википедия, The Guardian, StackOverflow, GitHub. ElasticSearch позволяет создавать копии индексов и сегментов.

пространство ключей (например, база данных в реляционных базах данных) и поддержка многих семейств столбцов или таблиц (таких же, как таблица в реляционных базах данных) и неограниченных строк.

из тегов 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:

Читайте также: