Cassandra UDT作为主键

ash*_*hic 4 cassandra

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

cat*_*aws 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>);

通常不是很明智,因为你失去了更新va而不更新vb的能力所以它实际上更灵活直接:

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识别行,因此除了电话组之外的2个相同的地址不会识别同一行.这种情况并不多见.更一般地说,PK往往相对简单,您可能希望对聚类列进行细粒度控制,因此UDT很少是好的候选者.

总之,PK列中的UDT并不总是坏的,在该上下文中通常不常用,因此用户不应该仅仅因为允许使用UDT for PK列.