Firebase多语言标签产品集合的数据设计与过滤查询咨询
问题背景
需求是列出/products集合的全部数据,同时支持按标签过滤产品;标签要支持多语言搜索,但得保持ID统一。目前设计的数据结构如下:
/tags -tag_id_1: {en: "red", de: "rot"} -tag_id_2: {en: "green", de: "grün"} -tag_id_3: {en: "blue", de: "blau"} /products -PRODUCT_1 -title: "" -description: "" -date: "" -tags: [tag_id_1,tag_id_2,tag_id_3] -PRODUCT_2 -title: "" -description: "" -date: "" -tags: [tag_id_3]
有两个疑问:
- 是否需要在每个产品里复制标签翻译,拆分出
tagIds数组和tags对象数组? - 当前结构能不能获取包含
tag_id_1、tag_id_2、tag_id_3的所有产品,并按date排序?
疑问1:不需要这么做
完全没必要在产品里存标签翻译,也不用拆分tagIds和tags对象数组,原因很简单:
- 重复存储标签翻译会造成数据冗余,以后要是修改某个标签的翻译,得挨个更新所有关联产品的标签内容,维护成本极高,还容易出现数据不一致的问题。
- 现有结构用
tag_id关联标签已经足够:用户用多语言搜索时,先在/tags集合里根据当前语言(比如英文搜"red",德文搜"rot")找到对应的tag_id,再拿这个ID去/products里过滤产品,完全能满足多语言搜索+ID统一的需求。 - 如果返回产品数据时需要附带标签的多语言文本,查完产品后批量去
/tags里获取对应的标签数据就行,这种按需关联的方式比提前存死灵活多了,还能节省存储空间。
疑问2:完全可以实现
当前结构完全能完成你要的操作:
- 过滤产品:直接在
/products集合里查询tags数组包含指定tag_id的文档即可。比如要找包含任意一个目标标签的产品,用数组包含查询;要是要找同时包含所有目标标签的产品,根据你使用的存储系统(比如Firestore、MongoDB),调用对应的多条件数组查询语法就行。 - 按date排序:在过滤查询的基础上,直接添加按
date字段的排序规则(升序或降序),大部分数据库/文档存储系统都支持这种组合操作。
举个Firestore的示例,查找包含tag_id_1的产品并按date降序排序:
db.collection('products') .where('tags', 'array-contains', 'tag_id_1') .orderBy('date', 'desc') .get()
要是要找同时包含三个标签的产品,可使用array-contains-any(若系统支持)或者组合多个array-contains条件,具体语法看你用的工具,但核心逻辑是可行的。
内容的提问来源于stack exchange,提问作者1110
相关产品推荐
相关产品推荐

