该句旨在阻止用户不加区分地使用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列.