使用 Apache Cassandra 在用户定义的类型中搜索
Search in user defined type with Apache Cassandra
在这个例子中:
CREATE TYPE address (
street text,
city text,
zip_code int,
phones set<text>
)
CREATE TABLE users (
id uuid PRIMARY KEY,
name text,
addresses map<string, address>
)
如何查询 city = newyork
的用户或查找具有特定 phone 号码的用户。
这实际上不是查询 user-defined 类型的问题:假设 address
将是单个 text
列并且 addresses
将包含单个地址(即 addresses TEXT
);问题是一样的。
你的用户 table 除了主键之外,其他任何东西都不意味着 query-able,在本例中是分区键,它是一个 UUID
准没用。
如果你想按名称查询用户,我会反规范化(这意味着一些重复)并制作 users_by_name
table:
CREATE TABLE users_by_name(
name TEXT,
id UUID,
addresses whatever,
PRIMARY KEY((name), id)
)
其中用户按name
存储(他们应该是唯一的)并且检索结果将按id
排序(id
是主键的聚类键部分).
同样适用于按地址查询:
CREATE TABLE users_by_name(
city TEXT,
street TEXT,
name TEXT,
id UUID,
PRIMARY KEY((city), street)
)
您可能认为它并没有真正解决您的问题,但看起来您是从关系数据库 (SQL) 的角度设计数据模型的,这不是 Cassandra 的目标。
在这个例子中:
CREATE TYPE address (
street text,
city text,
zip_code int,
phones set<text>
)
CREATE TABLE users (
id uuid PRIMARY KEY,
name text,
addresses map<string, address>
)
如何查询 city = newyork
的用户或查找具有特定 phone 号码的用户。
这实际上不是查询 user-defined 类型的问题:假设 address
将是单个 text
列并且 addresses
将包含单个地址(即 addresses TEXT
);问题是一样的。
你的用户 table 除了主键之外,其他任何东西都不意味着 query-able,在本例中是分区键,它是一个 UUID
准没用。
如果你想按名称查询用户,我会反规范化(这意味着一些重复)并制作 users_by_name
table:
CREATE TABLE users_by_name(
name TEXT,
id UUID,
addresses whatever,
PRIMARY KEY((name), id)
)
其中用户按name
存储(他们应该是唯一的)并且检索结果将按id
排序(id
是主键的聚类键部分).
同样适用于按地址查询:
CREATE TABLE users_by_name(
city TEXT,
street TEXT,
name TEXT,
id UUID,
PRIMARY KEY((city), street)
)
您可能认为它并没有真正解决您的问题,但看起来您是从关系数据库 (SQL) 的角度设计数据模型的,这不是 Cassandra 的目标。