You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Kotlin结合现有Foods数据类与用户ID逻辑构建Firestore数据库模型

输入图片描述

Firestore食谱数据库Schema设计方案

场景1:仅存储用户私有食谱(仅用户自己可见、可编辑)

采用「用户文档嵌套食谱子集合」的结构:

  • 根集合命名为users,集合内每个文档的ID直接对应用户的userID(即Firebase Auth返回的uid)
  • 每个用户文档下嵌套子集合foods,子集合内每个文档对应一个食谱,文档ID使用你数据类中的foodId即可,文档字段和你定义的Foods数据类完全对齐
    这种结构的优势:
  • 权限控制简单,Firebase安全规则可以直接限制每个用户仅能访问自己uid对应文档下的内容,不会出现越权访问问题
  • 查询效率高,查询当前用户的所有食谱、按分类/热量等条件筛选食谱,都只需要在子集合内查询即可

场景2:支持公共食谱+用户私有/收藏食谱

如果你的业务需要开放公共食谱给所有用户查看,同时支持用户自己创建私有食谱、收藏公共食谱,用以下结构:

  • 根集合1:public_foods,存储所有公开的食谱,文档ID为foodId,字段和Foods类完全一致,所有用户都有读权限
  • 根集合2:users,文档ID为用户uid,文档下嵌套两个子集合:
    • my_foods:存储用户自己创建的私有食谱,仅用户本人可读写
    • saved_foods:存储用户收藏的公共食谱,可冗余存储foodName、foodCalory、foodImg等列表页需要展示的字段,避免跨集合查询提升加载效率
代码实现示例

你可以直接用现有Foods数据类进行数据的读写,写入示例如下:

// 生成新的foodId,直接用Firestore自动生成的文档ID即可
val newFoodId = db.collection("users").document(userID).collection("foods").document().id
val newFood = Foods(
    foodId = newFoodId,
    foodName = "番茄炒蛋",
    foodCategory = "家常菜",
    foodCalory = 120,
    foodIngredients = "番茄2个、鸡蛋3个、盐少许、白砂糖适量",
    foodRecipe = "1. 鸡蛋打散下锅炒熟盛出备用;2. 番茄切块炒出汁水后加调料调味;3. 倒入鸡蛋翻炒均匀即可出锅",
    foodCookingTime = 15,
    foodImg = "图片存储地址"
)

// 写入到对应用户的食谱集合中
db.collection("users").document(userID)
    .collection("foods")
    .document(newFoodId)
    .set(newFood)
    .addOnSuccessListener {
        // 写入成功后的逻辑
    }
优化建议

如果后续需要按食材搜索食谱,可以把foodIngredients字段从字符串改为数组类型,每个元素对应一种食材,这样可以用Firestore的arrayContains查询方法快速筛选包含指定食材的食谱。

内容的提问来源于stack exchange,提问作者Ae.S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:54:06