如何使用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
相关产品推荐
相关产品推荐

