【问题标题】:Need suggestion on Cassandra Keyspaces sample需要有关 Cassandra Keyspaces 示例的建议
【发布时间】:2012-04-10 20:01:27
【问题描述】:

我一直在试用 Cassandra,需要一些帮助来理解一些问题。我是 cassandra 的新手,我不确定将 MySQL 数据库转换为 Cassandra 会导致我陷入陷阱,这是由于缺乏经验或对 cassandra 的了解有限。所以我希望我能从有经验的 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';

三个键空间 - 学生、教师和科目。 我肯定需要这些键空间之间的某种关系,并且还需要查询数据。 例如

  • 我会查询具有特定学科和/或班级的学生
  • 某班的老师
  • 列出某个班级的某个学生所修读的所有科目。

据我所知,我肯定需要创建二级索引才能使查询正常工作。也就是说,检索某些子句的数据。

我知道我是否正确

  • 我们在 cassandra 中没有“like”子句
  • 对于一列的每个值(最后一个键值对),该值必须被分解。那是个别的话。比如说,我想获得一个主题列表,因此每个主题都必须位于与其关联的不同列中。我无法查询类似于“subjectA,subjectB”的列值,而是将其分解为 SubjectA 和 SubjectB 并将它们放在不同的列中。

以下是键空间。

【问题讨论】:

    标签: database cassandra


    【解决方案1】:

    首先,Cassandra 是否适合您的工作? Cassandra 在处理需要高速读写能力的分布式、松散耦合的数据集方面做得非常出色,但是当您想在其之上实施关系模型时,它开始变得笨拙,因此我的问题是。 如果您有一个高度相关的数据集,就像您在此处展示的示例一样,重点在于确定信息之间的关系,那么 MySQL 将是比 Cassandra 更好的工具

    我认为您将键空间混淆为与 MySQL 表的 1-1 映射。 键空间将更直接地对应于数据库而不是数据库中的表。 首先,您可能需要重新设计键空间设置以将所有内容放在一起,如下所示:

    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) 
    

    在特定类和属于它的所有人员之间建立关系列族。

    分手
    是的,您需要按主题分解它们并将它们放入自己的列族中。请注意,您可以使用 secondary indices(从 Cassandra .7 开始),它允许您执行更多相等类型的查询,例如:

    get users where birth_date = 1973;
    

    关于二级指数的使用,另请参阅document。相关引用是,

    Cassandra 的内置二级索引最适用于多个 行包含索引值。存在的更独特的值 特定列,平均而言,您将拥有更多的开销 查询和维护索引。例如,假设您有一个用户 有十亿用户的表,想按状态查找用户 他们住过。许多用户将共享相同的状态列值 (例如加利福尼亚州、纽约州、德克萨斯州等)。这将是一个很好的候选人 二级索引。另一方面,如果您想通过以下方式查找用户 他们的电子邮件地址(通常对每个用户来说都是唯一的值), 手动维护动态列族可能更有效 作为“索引”的一种形式。即使对于包含唯一数据的列,它 使用二级索引通常在性能方面很好 方便,只要查询量到索引列族 适中且不处于恒定负载下。

    如果您还没有看过它,DataStax 网站会回答您的许多 Cassandra 问题,如果您打算广泛使用 Cassandra,我强烈建议您浏览它。

    简而言之,您的两个选项是解耦项目并为您要维护的每个关系创建列族,或者根据您分离数据的方式可能使用二级索引。我个人更喜欢前一种方法——尽管有样板——因为我认为它可以更好地扩展。

    【讨论】:

    • 其实我已经有一个数据库了,但是和我介绍的相差很多。所以我不得不以不同的方式复制这个问题,以方便 SO 读者。现在的问题是它变得非常大,所以我必须切换到大数据数据存储/数据库,然后切换到 cassandra。感谢您解决了我的一个大疑问。正如您在 1-1 映射中所指出的那样。我仍在努力解决更多问题,但您的观点非常有帮助......谢谢。
    • 您能否指导我了解我所问的“对于一列的每个值(最后一个键值对),该值必须被分解......”?跨度>
    • 查看编辑后的答案。简短的回答,是的,您可能应该将它们分开。
    • 感谢您的详细回复。
    猜你喜欢
    • 2014-11-01
    • 2015-08-29
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2011-02-21
    相关资源
    最近更新 更多