Cassandra中的一对多映射

NGR*_*NGR 2 cassandra cassandra-2.0

我是Cassandra的新手,想做一对多用户及其车辆的映射.一个用户可能有多个车辆.我的用户表将包含用户详细信息,如姓名,姓氏等.车辆表将包含车辆详细信息.

我的选择查询将获取特定用户的所有车辆详细信息.

我应该如何在卡桑德拉设计这个?

Aar*_*ron 6

您可以在一个表中轻松地对此进行建模:

CREATE TABLE userVehicles (
  userid text,
  vehicleid text,
  name text static,
  surname text static,
  vehicleMake text,
  vehicleModel text,
  vehicleYear text,
  PRIMARY KEY (userid,vehicleid)
);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以一次性查询单个用户的车辆,并且您的用户数据可以static存储在分区键级别.只要用户对车辆的基数不是太大(如同用户有1000辆车一样),这应该可以正常工作.

我上面考虑过的案例非常简单.但是,如果我的用户有大约20到30个字段和车辆相同的详细信息怎么办?你还建议有一张桌子并复制所有车辆的用户数据吗?

这取决于.您的用例是否需要全部返回?如果是这样,那么"是"我仍然会推荐这种方法.从Cassandra中获得最佳查询性能的方法是对表进行建模以适合您的查询.当Cassandra可以通过特定键或一系列行(按顺序存储)读取单行时效果最佳.您希望避免执行多个查询或编写强制Cassandra执行随机读取的查询.

拥有2个不同的表(如User和Vehicle和Vehicle表)会产生主键为User_Id和Vehicle_Id的后果是什么?

在分布式系统中,网络时间是敌人.通过拥有两个表,您现在正在进行两个查询...假设用户与车辆的比率为1比1.但如果您的用户有8辆车,那么您现在需要9个查询才能获得结果.通过上面的设计,您可以在1个查询中构建结果集(最小化网络时间).此外,userid作为分区键,该查询保证由一个节点提供服务,而不是对车辆数据的附加查询,这很可能需要联系多个节点.