官方文档告诉我们不要将UDT用于主键。这有什么特别的原因吗?这样做有什么潜在的缺点?
答案 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列的方法允许的。