【发布时间】:2012-11-25 18:54:01
【问题描述】:
我一直读到,如果您的应用程序经常更改并且经常添加功能,Cassandra 是很好的。
这是有道理的,因为您没有任何固定架构,您可以向行添加列以满足您的需要,而不是运行 ALTER TABLE 查询,这可能会为非常大的表冻结您的数据库数小时。
但是,我有一个无法解决的假设性问题。 假设我有:
CREATE COLUMN FAMILY Students
with comparator='CompositeType(UTF8Type,UTF8Type),
and key_validation_class=UUIDType;
每个学生都有一些通用列(你知道,meta:username、meta:password、meta:surname 等),而且每个学生都可以学习 N 门课程。这种 N-N 关系是使用非规范化解决的,将 N 列添加到每个学生(课程:ID1,课程:ID2)。
另一方面,我可能有一个 Courses CF,其中每一行都包含以下所有学生 UUID。
所以我可以问“XXX学习了哪些课程”和“哪些学生学习了YYY课程”。
问题是:如果我没有创建第二个列族怎么办?也许在构建应用程序时,让学生学习特定课程并不是必需的。
这是一个简单的例子,但我相信它很常见。 “使用 Cassandra,您可以根据查询而不是关系来计划 CF”。我现在需要那个查询,而一开始它并不需要。
给定一个包含数千个条目的学生表,您将如何填写 Courses CF?这是 Hadoop、Pig 还是 Hive 的工作(我从未接触过这些,只是猜测)。
【问题讨论】:
-
@ChrisGerken:我不这么认为。他不想复制数据;他想根据现有数据生成新数据。这需要不同的工具。
-
嗯,重要的事实是,有一种方法可以非常快地完成这项工作,通过 Pig 并行执行,并且该操作不会 DOS 后面的应用程序...