Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 如何在Cassandra中设计表,其中必须通过列表查找行<;varchar>;?_Database Design_Cassandra_Cql - Fatal编程技术网

Database design 如何在Cassandra中设计表,其中必须通过列表查找行<;varchar>;?

Database design 如何在Cassandra中设计表,其中必须通过列表查找行<;varchar>;?,database-design,cassandra,cql,Database Design,Cassandra,Cql,假设我在Cassandra中有以下对象要保留: Foo的数组: { "id":1, "name": "this is a name", "bundleFields" : [ "bundleByMe", "me2", "me also", ] }, { "id":2, "name": "anotherName", "bundleFields" : [ "bundleByMe",

假设我在Cassandra中有以下对象要保留:

Foo的数组:

{
    "id":1,
    "name": "this is a name",
    "bundleFields" : [
        "bundleByMe",
        "me2",
        "me also",
    ]
},
{
    "id":2,
    "name": "anotherName",
    "bundleFields" : [
        "bundleByMe",
        "me2",
        "me also",
    ]
},
{
    "id":3,
    "name": "thridName",
    "bundleFields" : [
        "differentBundleCriteria"
    ]
}
我想从FOO中查询类似于
SELECT*的内容,其中bundleFields=[“…”,“…”]

这显然不起作用,因为无法通过
list
进行查询(没有Primarykey)

这是我目前拥有的模式:

CREATE TABLE IF NOT EXISTS Foo (
    id int,
    name varchar,
    bundleFields list<varchar>,
    PRIMARY KEY(id)
);
这是卡桑德拉推荐的解决这个问题的方法吗

我觉得必须序列化/反序列化bundleFields数组的想法并不“正确”

谢谢你的建议


编辑:正如@rs_atl建议的,表fooByBundleString的正确DDL应该是(注意主键中的附加
fooId
):


创建一个覆盖索引,否则就不可能为不同的fooId存储相同的bundleString。

如您所述创建一个索引是正确的解决方案。但是,它应该是一个覆盖索引,这意味着您需要复制查询中实际需要返回的任何值。否则,您将在应用程序中执行分布式连接,这是非常昂贵的。一般来说,我们更喜欢非规范化数据模型而不是规范化关系模型。这与在您最喜欢的RDBMS中进行快速查询所必须做的基本相同。区别在于您必须在应用程序中管理索引;卡桑德拉不会帮你的。

顺便说一句:我在这里描述的技术,人们称之为反向索引(或某种类型的)?谢谢@philip。我已经知道如何在cql3中存储集合。但这并不能解决我的问题。(
Foo
包含一个列表
bundleFields
)。我想按集合(
bundleFields
)查询Cassandra表。因为这是不可能的,因为集合不能是主键的一部分,所以我要求提供一个支持此类查询的数据模型。谢谢@rs_atl,我已经用更新的DDL编辑了我的问题,以便有一个覆盖索引。所以,在应用程序代码中连接bundleString数组并将其存储在单独的查找表中是您建议的方式?!谢谢那么我就接受了。这些答案看起来是否和我的尝试一样。建议的解决方案与您的建议类似。是的,您的模式是正确的。这将使您能够查询给定bundleString的所有fooId。
CREATE TABLE IF NOT EXISTS fooByBundleString (
    bundleString varchar,
    fooId int,
    PRIMARY KEY(bundleString)
);
CREATE TABLE IF NOT EXISTS fooByBundleString (
    bundleString varchar,
    fooId int,
    PRIMARY KEY(bundleString, fooId)
);