Database design 如何在Cassandra中设计表,其中必须通过列表查找行<;varchar>;?
假设我在Cassandra中有以下对象要保留: Foo的数组: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",
{
"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)
);