首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >卡桑德拉的一对多地图

卡桑德拉的一对多地图
EN

Stack Overflow用户
提问于 2016-09-07 14:01:19
回答 2查看 2.1K关注 0票数 2

我是新的卡桑德拉,并想做一个对许多用户和它的车辆的地图。一个用户可以有多个车辆。我的用户表将包含用户详细信息,如名称、姓氏等,而车辆表将包含车辆详细信息。

我的select查询将获取特定用户的所有车辆详细信息。

我该怎么用卡桑德拉设计这个?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-07 15:52:30

您可以很容易地在一个表中对其建模:

代码语言:javascript
运行
复制
CREATE TABLE userVehicles (
  userid text,
  vehicleid text,
  name text static,
  surname text static,
  vehicleMake text,
  vehicleModel text,
  vehicleYear text,
  PRIMARY KEY (userid,vehicleid)
);

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

我刚才考虑过的情况很简单。但是,如果我的用户有很多的细节大约20到30个字段,同样的车辆。你仍然会建议有一个单一的表,并复制所有车辆的用户数据?

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

拥有两个不同的表,如用户和车辆,以及车辆表将有主键作为User_Id和Vehicle_Id,会带来什么后果?

在分布式系统中,网络时代是敌人。通过拥有两个表,您现在使两个queries...assuming成为用户与车辆的1:1比例。但是如果你的用户有8辆车,你现在需要9个查询才能达到你的结果。有了上面的设计,您可以在1个查询中构建结果集(最小化网络时间)。另外,使用userid作为分区键,该查询保证由一个节点提供,而不是对车辆数据的额外查询,后者很可能需要联系多个节点。

票数 6
EN

Stack Overflow用户

发布于 2016-09-07 14:57:03

这似乎很简单,有两个表,一个包含所有车辆数据,另一个用于满足您的查询:

代码语言:javascript
运行
复制
CREATE TABLE vehicles (
    vehicle_id bigint,
    vehicle_type int,
    vehicle_name text,
    ...
    PRIMARY KEY (vehicle_type)
)

CREATE TABLE vehicles_to_users (
    user_id bigint,
    vehicle_id bigint,
    vehicle_type int,
    vehicle_name text,
    ...
    PRIMARY KEY (user_id, vehicle_type)
)

然后,您将通过以下方式查询:

代码语言:javascript
运行
复制
SELECT * FROM vehicles_to_users WHERE user_id = 9;

或类似于获取属于特定用户的所有特定车辆类型的信息:

代码语言:javascript
运行
复制
SELECT * FROM vehicles_to_users WHERE user_id = 9 AND vehicle_type = 1;

这是一种使用非规范化数据的解决方案,您应该始终考虑这种方法,而不是使用这样的方法:

代码语言:javascript
运行
复制
CREATE TABLE vehicles (
    vehicle_id bigint,
    vehicle_type int,
    vehicle_name text,
    ...
    PRIMARY KEY (vehicle_type)
)

CREATE TABLE vehicles_to_users (
    user_id bigint,
    vehicle_id bigint,
    PRIMARY KEY (user_id)
)

因为它属于关系数据库世界,您必须运行N+1查询才能满足您的需求:一个是获取属于特定用户的所有ids,然后是N个查询以获取每个车辆的所有信息:

代码语言:javascript
运行
复制
SELECT * FROM vehicles_to_users WHERE user_id = 9;
SELECT * FROM vehicles WHERE vehicle_id = 115;
SELECT * FROM vehicles WHERE vehicle_id = 116;
SELECT * FROM vehicles WHERE vehicle_id = ...;

也不要像这样使用IN clausole:

代码语言:javascript
运行
复制
SELECT * FROM vehicles WHERE vehicle_id IN (115,116,....);

因为由于协调器节点必须做的额外工作,它的性能会更差。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39372012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档