Cassandra UDT作为主键

时间:2014-10-21 16:42:37

标签: cassandra

官方文档告诉我们不要将UDT用于主键。这有什么特别的原因吗?这样做有什么潜在的缺点?

1 个答案:

答案 0 :(得分:6)

该句旨在阻止用户不加区分地使用UDT for PK列。 UDT目前的化身(即,考虑到Cassandra支持“冻结”UDT)的主要动机是在集合中存储更复杂的值。在外部收藏中,UDT可以使用它,但如果你需要,它值得问自己两次。例如:

CREATE TYPE myType (a text, b int);

CREATE TABLE myTable (id uuid PRIMARY KEY, v frozen<myType>);

通常不是很明智,因为你在没有更新v.b的情况下失去了更新v.a的能力。所以直接做它实际上更灵活:

CREATE TABLE myTable (id uuid PRIMARY KEY, a text, b int);

这个简单的例子指出集合之外的UDT不一定是好事,这也扩展到主键列。这不一定更好:

CREATE TYPE myType (a text, b int);

CREATE TABLE myTable (id frozen<myType> PRIMARY KEY);

而不仅仅是:

CREATE TABLE myTable (a text, b int, PRIMARY KEY ((a, b)))

此外,关于主键,任何复杂的UDT可能都没有意义。考虑即使是中等复杂的类型,如:

CREATE TYPE address ( number int, street text, city text, phones set<text> )

在主键内部使用这样的类型几乎肯定不是很有用,因为PK识别行,因此除了电话集之外的两个地址相同不会识别同一行。这种情况并不多见。更一般地说,PK往往相对简单,您可能希望对聚类列进行细粒度控制,因此UDT很少是合适的候选者。

总之,PK列中的UDT 总是一个坏的,在该上下文中通常不常用,因此用户不应该只是因为它是在寻找使用UDT for PK列的方法允许的。