2016-01-03 56 views
1

定义的类型在这个例子中:搜索与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或找到一个特定的电话号码的用户。

+0

我同意接受的答案,您应该考虑以一种更适合Cassandra的方式重新设计您的数据模型。但是,更广泛地说,将Cassandra与Apache Solr集成允许查询非主键字段,包括用户定义的类型:http://docs.datastax.com/en/latest-dse/datastax_enterprise/srch/srchUDT.html(链接为在Solr中为DataStax企业Cassanra软件包配置UDT的指南,该软件包不是免费的)。 – JohnC

回答

3

这不是真正询问用户定义类型的一个问题:想象address将是一个单个text列和addresses将含有单一地址;(即addresses TEXT)。问题会是一样的。

您的用户表并不意味着可以通过除主键之外的其他任何东西进行查询,在这种情况下,主键是分区键,这是一个UUID,这使得它几乎没有用处。

如果你要查询的名字的用户我会反规范化(即意味着某种重复),并作出users_by_name表:

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的目标。

+1

谢谢你有帮助 – reihaneh