Apache Ignite如何存储带Map<String,List<String>>字段的对象并实现索引搜索
含集合类型属性的Entity快速索引查询最优实现方案
选型1:保留现有关系型数据库的实现
如果不想额外引入新的存储组件,可选择以下两种方式:
- 拆分存储方案:额外创建两张关联表存储标签数据
entity_tag_key表:字段为entity_guid、tag_key,关联Entity主键guid,对tag_key建立索引entity_tag_value表:字段为entity_guid、tag_key、tag_value,对(tag_key, tag_value)建立联合索引
其余基础字段timestamp、domain、type直接在Entity主表建普通索引即可,查询时通过多表JOIN实现标签条件过滤。
- JSON索引方案:如果使用的是MySQL 5.7+、PostgreSQL等支持JSON类型的关系型数据库,可将
tags字段直接定义为JSON类型存储,针对查询常用的标签键值创建JSON函数索引,性能优于多表JOIN方案,也无需额外维护关联表。
选型2:原生支持集合索引的存储实现(性能更优)
如果可调整存储架构,优先选择对集合类型有原生支持的存储方案:
- 文档数据库方案:选用MongoDB,直接将整个Entity作为文档存储,
tags作为嵌套对象无需额外转换。可直接对tags下的键、数组值创建多键索引,原生支持集合属性的等值、包含等查询,其余基础字段直接创建普通索引即可,实现成本低,查询性能远高于关系型数据库的折衷方案。 - 搜索引擎方案:如果有复杂多条件组合查询、聚合统计需求,可选用Elasticsearch存储数据。
tags作为嵌套对象存储,创建对应类型索引后,除了基础查询外还支持范围查询、全文检索等能力,适合大数据量、查询逻辑复杂的场景。
内容的提问来源于stack exchange,提问作者Danila Ermakov
相关产品推荐
相关产品推荐

