Дизайн схемы Кассандры

Я продолжаю изучать Cassandra и хочу создать отношение Student ‹=> Course, похожее на отношение Many-to-Many в СУБД.

Что касается запросов, я буду использовать следующий запрос;

  1. Получить все курсы, на которые зачислен студент.
  2. Получить всех студентов, зачисленных на определенный курс.

Допустим, я создаю Column Families. один для курса, а другой для студента.

CREATE COLUMN FAMILY student with comparator = UTF8Type AND key_validation_class=UTF8Type and column_metadata=[ 
{column_name:firstname,validation_class:UTF8Type} 
{column_name:lastname,validation_class:UTF8Type}
{column_name:gender,validation_class:UTF8Type}];


CREATE COLUMN FAMILY course with comparator = UTF8Type AND key_validation_class=UTF8Type and column_metadata=[ 
{column_name:name,validation_class:UTF8Type} 
{column_name:description,validation_class:UTF8Type}
{column_name:lecturer,validation_class:UTF8Type}
{column_name:assistant,validation_class:UTF8Type}];

Теперь, как мне двигаться дальше?

Должен ли я создать третье семейство столбцов с courseID:studentId CompisiteKey? если да, могу ли я использовать Hector для запроса только одного (левого или правого) компонента составного ключа?

Пожалуйста помоги.

Обновление:

Следуя предложению, я создал следующую схему:

Для студента:

CREATE COLUMN FAMILY student with comparator = UTF8Type and key_validation_class=UTF8Type and default_validation_class=UTF8Type;

а затем мы добавим некоторые данные:

set student['student.1']['firstName']='Danny'
set student['student.1']['lastName']='Lesnik'
set student['student.1']['course.1']=''
set student['student.1']['course.2']='';

Создайте столбец Family for Course:

CREATE COLUMN FAMILY course with comparator = UTF8Type and key_validation_class=UTF8Type and default_validation_class=UTF8Type;

добавить некоторые данные:

set course['course.1']['name'] ='History'
set course['course.1']['description'] ='History Course'
set course['course.1']['name'] ='Algebra'
set course['course.1']['description'] ='Algebra Course'

и, наконец, студент на курсе:

CREATE COLUMN FAMILY StudentInCourse with comparator = UTF8Type and key_validation_class=UTF8Type and default_validation_class=UTF8Type;

добавить данные:

set StudentInCourse['studentIncourse.1']['student.1'] =''; 
set StudentInCourse['studentIncourse.2']['student.1'] =''; 

person danny.lesnik    schedule 25.09.2012    source источник


Ответы (1)


Ниже я определил модель данных, но проще сначала описать объектную модель, а затем погрузиться в модель строк, поэтому с точки зрения PlayOrm у вас будет

public class Student {
  @NoSqlId
  private String id;
  private String firstName;
  private String lastName;
  @ManyToMany
  private List<Course> courses = new ArrayList(); //constructing avoids nullpointers
}

public class Course {
  @NoSqlId
  private String id;
  private String name;
  private String description
  @ManyToOne
  private Lecturer lecturer;
  @ManyToMany
  private CursorToMany students = new CursorToManyImpl();
}

Я мог бы использовать список в курсе, но я был обеспокоен тем, что могу получить OutOfMemory, если слишком много студентов будут проходить курс годами, годами и годами. ТЕПЕРЬ давайте перейдем к тому, что делает PlayOrm, и вы можете сделать что-то подобное, если хотите.

Один студенческий ряд будет выглядеть так

rowKey(the id in above entity) = firstName='dean',
lastName='hiller' courses.rowkey56=null, courses.78=null, courses.98=null, courses.101=null

Это широкая строка, в которой у нас есть много столбцов с именем «имя поля» и «ключ строки к фактическому курсу».

Строка «Курс» немного интереснее… потому что пользователь думает, что загрузка всех «Студентов» для одного курса может привести к нехватке памяти, он использует курсор, который загружает только 500 за раз, когда вы зацикливаетесь на нем.

В этом случае у PlayOrm есть две строки, поддерживающие курс. Итак, давайте возьмем нашу строку пользователя выше, и он был в курсе rowkey56, поэтому давайте опишем этот курс

rowkey56 = name='coursename', description='somedesc', lecturer='rowkey89ToLecturer'

Затем в некоторой индексной таблице есть еще одна строка для студентов (это очень широкая строка, поэтому она поддерживает до миллионов студентов).

indexrowForrowkey56InCourse = student34.56, student39.56, student.23.56.... 
into the millions of students

Однако, если вы хотите, чтобы курс посещали более миллиона студентов, вам нужно подумать о разделении независимо от того, используете ли вы playOrm или нет. Однако PlayOrm делает для вас разбиение, если вам это нужно.

ПРИМЕЧАНИЕ. Если вы не знаете спящий режим или JPA, когда вы загружаете вышеприведенный Student, он загружает список прокси-серверов, поэтому, если вы начнете перебирать курсы, он затем вернется в хранилище noSQL и загрузит курсы, чтобы вы не придется ;).

В случае с курсом загружается прокси-лектор, который не заполняется до тех пор, пока вы не получите доступ к полю свойства, такому как лектор.getName(). Если вы вызываете лектор.getId(), ему не нужно загружать лектора, так как он уже есть из строки курса.

РЕДАКТИРОВАТЬ (подробнее): PlayOrm имеет 3 таблицы индексов Decimal (хранит двойные, плавающие и т. Д. И BigDecimal), Integer (длинные, короткие и т. д., BigInteger и логические) и таблицы индексов String. Когда вы используете CursorToMany, он использует одну из этих таблиц в зависимости от типа ключа FK. Он также использует эти таблицы для своего языка Scalable-SQL. Причина, по которой он использует отдельную строку в CursorToMany, заключается в том, что клиенты не получают OutOfMemory при чтении строки, поскольку в некоторых случаях toMany может иметь один миллион FK. Затем CursorToMany считывает пакеты из этой строки индекса.

позже, Дин

person Dean Hiller    schedule 26.09.2012
comment
Спасибо за ваш ответ. Не могли бы вы посмотреть на мое обновление. Я думаю, что моя схема почти такая же, как вы предложили. Пожалуйста, поправьте меня, если я ошибаюсь. - person danny.lesnik; 28.09.2012
comment
Другой вопрос. что вы подразумеваете под строкой в ​​какой-то индексной таблице? Не могли бы вы объяснить это немного подробнее? - person danny.lesnik; 30.09.2012
comment
и да, вы можете сделать эту схему в своем обновлении ИЛИ вместо этого вы можете иметь только два семейства col и вставлять tomany в ту же строку, что и таблицы для студентов и курсов (но опять же зависит от того, что вы хотите/нужно). - person Dean Hiller; 20.10.2012