我是新的卡桑德拉,并想做一个对许多用户和它的车辆的地图。一个用户可以有多个车辆。我的用户表将包含用户详细信息,如名称、姓氏等,而车辆表将包含车辆详细信息。
我的select查询将获取特定用户的所有车辆详细信息。
我该怎么用卡桑德拉设计这个?
发布于 2016-09-07 15:52:30
您可以很容易地在一个表中对其建模:
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
作为分区键,该查询保证由一个节点提供,而不是对车辆数据的额外查询,后者很可能需要联系多个节点。
发布于 2016-09-07 14:57:03
这似乎很简单,有两个表,一个包含所有车辆数据,另一个用于满足您的查询:
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)
)
然后,您将通过以下方式查询:
SELECT * FROM vehicles_to_users WHERE user_id = 9;
或类似于获取属于特定用户的所有特定车辆类型的信息:
SELECT * FROM vehicles_to_users WHERE user_id = 9 AND vehicle_type = 1;
这是一种使用非规范化数据的解决方案,您应该始终考虑这种方法,而不是使用这样的方法:
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个查询以获取每个车辆的所有信息:
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:
SELECT * FROM vehicles WHERE vehicle_id IN (115,116,....);
因为由于协调器节点必须做的额外工作,它的性能会更差。
https://stackoverflow.com/questions/39372012
复制相似问题