如何在Firebase中搭建类似SQL的三表关联数据存储结构?
Firebase Firestore 结构实现方案
首先先明确Firebase常用的Cloud Firestore和传统SQL数据库的核心差异,帮你快速理解逻辑:
- SQL中的表对应Firestore的集合(Collection)
- SQL中的行记录对应Firestore的文档(Document)
- Firestore没有原生外键约束,关联关系靠业务代码维护,只要在文档中存储关联的ID字段即可
- 文档主键默认是Firebase自动生成的字符串ID,你可以手动指定为需求里的int类型数值作为文档ID
1. 人员集合(对应你需求的第一个Person表)
集合命名建议为 persons,每个文档的ID直接设置为你要求的Person_ID(int类型数值),文档内部字段如下:
rate:数字类型(Firestore数字类型原生兼容double精度)name:字符串类型surname:字符串类型
参考数据示例:
{ "rate": 22.5, "name": "明", "surname": "李" }
2. 支出集合(对应你需求的第二个spese表)
集合命名建议为 expenses,每个文档的ID直接设置为你要求的id_spese(int类型数值),文档内部字段如下:
amount:数字类型(兼容Double精度)DateSpesa:时间戳类型(优先用Firestore原生时间类型,比存字符串更方便做时间范围查询)TipoSpesa:字符串类型Person_ID:数字类型(存储关联的人员ID,对应persons集合的文档ID)
参考数据示例:
{ "amount": 159.9, "DateSpesa": 2024-06-10T13:30:00Z, "TipoSpesa": "交通", "Person_ID": 1 }
3. 行程集合(对应你需求的第三个Travel表)
集合命名建议为 travels,每个文档的ID直接设置为你要求的Travel_ID(int类型数值),文档内部字段如下:
delivered:布尔类型urgent:布尔类型Person_ID:字符串类型(存储对应人员ID的字符串格式,关联persons集合的文档ID即可)KM_routes:数字类型(注意字段名不要带空格,避免查询时报语法错误,建议统一用下划线命名)
参考数据示例:
{ "delivered": true, "urgent": false, "Person_ID": "1", "KM_routes": 87 }
常用操作提示
- 要查询某个人的所有支出/行程,直接对
expenses/travels集合执行where("Person_ID", "==", 目标人员ID)的条件查询即可 - Firestore没有强制外键校验,删除人员文档时,关联的支出/行程文档需要你手动写业务代码删除,也可以搭配Firebase Cloud Function触发自动清理
- 所有字段名建议不要带空格、特殊符号,优先用驼峰或下划线命名,避免后续查询出现异常
内容的提问来源于stack exchange,提问作者Ra1Ca7 eM
相关产品推荐
相关产品推荐

