CassandraDB含3个静态列及动态键值对的可扩展表如何定义?
Cassandra 动态属性表定义方案
你要的固定静态列+灵活动态键值对的存储需求,刚好适配Cassandra的静态列特性:同一分区下的所有行共享静态列的值,动态键值对作为独立行存储,不会重复占用空间,支持无上限扩展动态属性。
首先给出完整建表语句,你可以直接用:
-- 如果你还没创建键空间,先执行这一步(副本策略和因子可根据你的集群配置调整) CREATE KEYSPACE IF NOT EXISTS user_profile WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3}; USE user_profile; -- 核心表结构 CREATE TABLE IF NOT EXISTS user_attrs ( user_id UUID, name TEXT STATIC, city TEXT STATIC, age INT STATIC, dynamic_key TEXT, dynamic_value TEXT, PRIMARY KEY (user_id, dynamic_key) );
结构说明
- 分区键用
user_id作为用户唯一标识,同一个用户的所有数据都存在同一个分区,查询性能最优 - 三个静态列
name/city/age用STATIC修饰,同一个用户下只会存储1次,不会每条动态属性都重复存储 - 聚类列
dynamic_key存动态属性的键,比如你示例里的Car、Job、Main hobby dynamic_value存对应动态属性的值,如果你需要存储非字符串类型的动态值,也可以把这一列改成VARIANT类型,或者额外加一个value_type字段标记值的类型
示例数据插入语句
对应你给出的测试数据,插入逻辑如下:
-- 先插入用户静态属性,同一个用户只需要插1次 INSERT INTO user_attrs (user_id, name, city, age) VALUES (uuid(), 'Mark', 'Liverpool', 26); -- 假设刚才插入Mark生成的user_id为 123e4567-e89b-12d3-a456-426614174000,插入动态属性 INSERT INTO user_attrs (user_id, dynamic_key, dynamic_value) VALUES (123e4567-e89b-12d3-a456-426614174000, 'Car', 'Audi A3'); INSERT INTO user_attrs (user_id, dynamic_key, dynamic_value) VALUES (123e4567-e89b-12d3-a456-426614174000, 'Job', 'Computer Engineer'); INSERT INTO user_attrs (user_id, dynamic_key, dynamic_value) VALUES (123e4567-e89b-12d3-a456-426614174000, 'Main hobby', 'Football');
常用查询示例
-- 查询用户全量属性(包含静态和所有动态属性) SELECT * FROM user_attrs WHERE user_id = 123e4567-e89b-12d3-a456-426614174000; -- 仅查询用户静态属性 SELECT DISTINCT user_id, name, city, age FROM user_attrs WHERE user_id = 123e4567-e89b-12d3-a456-426614174000; -- 查询用户单个动态属性的值 SELECT dynamic_value FROM user_attrs WHERE user_id = 123e4567-e89b-12d3-a456-426614174000 AND dynamic_key = 'Job';
内容的提问来源于stack exchange,提问作者Retourned
相关产品推荐
相关产品推荐

