Нужно предложение по образцу Cassandra Keyspaces - PullRequest
0 голосов
/ 27 марта 2012

Я пробовал Кассандру и мне нужна помощь в понимании некоторых вопросов.Я новичок в Кассандре, и я не уверен, что перевод базы данных MySQL в Кассандру приведет меня к подводным камням, которые могут быть вызваны неопытностью или ограниченными знаниями о Кассандре.Поэтому я надеюсь, что смогу получить полезную информацию от опытных пользователей / разработчиков cassandra.

Ниже приведены примеры созданных мною ключей.Я хотел бы знать любой недостаток в дизайне, если кто-то из своего опыта может указать.

create keyspace Students with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and strategy_options = {replication_factor:1};
use Students;
create column family StudentID with column_type = 'Super' and comparator = 'UTF8Type' and subcomparator = 'UTF8Type' and default_validation_class = 'UTF8Type' and column_metadata = 
[{column_name : 'First Name', validation_class : UTF8Type}, 
{column_name : 'Last Name', validation_class : UTF8Type}, 
{column_name : 'Subjects', validation_class : UTF8Type}, 
{column_name : 'Class', validation_class : UTF8Type}];


 set StudentID[utf8('1968')]['00001']['First Name'] = 'Mark';
 set StudentID[utf8('1968')]['00001']['Last Name'] = 'Myers';
 set StudentID[utf8('1968')]['00001']['Subjects'] = 'Maths, Chemistry';
 set StudentID[utf8('1968')]['00001']['Class'] = '10th grade';


create keyspace Teachers with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and strategy_options = {replication_factor:1};
use Teachers;
create column family TeacherID with column_type = 'Super' and comparator = 'UTF8Type' and subcomparator = 'UTF8Type' and default_validation_class = 'UTF8Type' and column_metadata = 
[{column_name : 'First Name', validation_class : UTF8Type}, 
{column_name : 'Last Name', validation_class : UTF8Type}, 
{column_name : 'Subjects', validation_class : UTF8Type}, 
{column_name : 'Class', validation_class : UTF8Type}];

set TeacherID[utf8('777')]['234-333']['First Name'] = 'Mark';
set TeacherID[utf8('777')]['234-333']['Last Name'] = 'Myers';
set TeacherID[utf8('777')]['234-333']['Subjects'] = 'Maths, Chemistry,physics';
set TeacherID[utf8('777')]['234-333']['Class'] = '10th grade, 11th grade, 9th grade';



create keyspace Subjects with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy' and strategy_options = {replication_factor:1};
use Subjects;
create column family SubjectNames with default_validation_class = 'UTF8Type' and comparator = 'UTF8Type' and column_metadata = 
[{column_name : 'Names1', validation_class : UTF8Type}];


set SubjectNames[utf8('Current')]['Name1']= 'maths';
set SubjectNames[utf8('Current')]['Name2']= 'physics';
set SubjectNames[utf8('Current')]['Name3']= 'chemistry';
set SubjectNames[utf8('Current')]['Name4']= 'CS';

Три ключевых пространства - студенты, учителя и предметы.Я определенно нуждался бы в некоторой взаимосвязи между этими пространствами клавиш, а также потребовал бы запроса данных.например,

  • Я бы запросил студентов с определенным предметом и / или классом
  • Учитель с определенным классом
  • Перечислите все предметы, которые изучает определенный студент изопределенный класс.

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

Что я знаю, если я прав?

  • У нас нет предложения 'like' в cassandra
  • Для каждого значения столбца (самый последний ключ -пара значений), значение должно быть разбито.Это к отдельным словам.Скажем, я хочу получить список предметов, поэтому каждый предмет должен находиться в отдельном столбце, связанном с ним.Я не могу запросить значения столбцов, которые похожи на "subjectA, subjectB", вместо этого я бы разбил их на SubjectA и SubjectB и поместил бы их в разные столбцы.

Ниже приведены пространства клавиш.

students subject teachers

1 Ответ

1 голос
/ 27 марта 2012

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

Я думаю, вы путаете сочетания клавиш как 1-1 с таблицами MySQL. Пространство ключей будет более точно соответствовать базе данных, а не таблице в базе данных. Во-первых, вы можете захотеть изменить настройки своего пространства ключей, чтобы собрать все вместе, что-то вроде этого:

keyspace: School
Column Family: Student ; Row Key: StudentID ; Col1 = First Name, Col2 = Last Name, Col3 = subjects, Col4 = class.

Повторите эти действия для двух других семейств столбцов - не уверены, нужны ли вам суперсайты или нет.

Для сквозного поиска вам необходимо создать семейство столбцов, например:

Column Family: Class ; RowKey: ClassId (ie 10th Grade) ; col1= (TeacherId:TeacherId), Col2 = (StudentId:StudentId) 

построить семейную колонку отношений между конкретным классом и всеми людьми, которые к нему относятся.

Разделение
Да, вам нужно разбить их по предметам и поместить в их собственные семейства столбцов.Будьте осторожны, вы можете использовать вторичные индексы (по состоянию на Cassandra .7), которые позволяют выполнять больше запросов типа равенства, таких как:

get users where birth_date = 1973;

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

Встроенные вторичные индексы Cassandra лучше всего подходят для случаев, когда многие строки содержат индексированное значение.Чем больше уникальных значений существует в определенном столбце, тем больше у вас в среднем затрат на запрос и поддержку индекса.Например, предположим, что у вас есть пользовательская таблица с миллиардом пользователей, и вы хотите искать пользователей по состоянию, в котором они жили. Многие пользователи будут использовать одно и то же значение столбца для состояния (например, CA, NY, TX и т. Д.).Это было бы хорошим кандидатом на вторичный индекс.С другой стороны, если вы хотите искать пользователей по их адресу электронной почты (значение, которое обычно является уникальным для каждого пользователя), может быть более эффективно вручную поддерживать динамическое семейство столбцов как форму «индекса».Даже для столбцов, содержащих уникальные данные, часто для удобства целесообразно использовать вторичные индексы, если объем запроса к семейству индексированных столбцов умеренный и не находится под постоянной нагрузкой.

ЕслиВы еще не видели, веб-сайт DataStax ответит на многие ваши вопросы о Cassandra, я настоятельно рекомендую просмотреть его, если вы собираетесь широко использовать Cassandra.

Короче говоря, вы можете разделить элементы и создать семейства столбцов для каждого отношения, которое вы хотите поддерживать, ИЛИ возможно использовать вторичные индексы в зависимости от того, как вы разделяете ваши данные.Я лично предпочитаю первый метод - несмотря на шаблон - потому что я думаю, что он лучше масштабируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...