如何使用 Angular 10 和 Cloud Firestore 按引用类型建立 1:N 关系

How to make 1:N relationship by reference type using Angular 10 and Cloud Firestore

我们正在寻找一种允许用户使用 Angular 10.

购买数字内容的机制

我正在考虑如何使用 Angular 10 和 Cloud Firestore 创建与引用类型的 1:N 关系,方法是参考 digitalcontents.service.ts 中的以下内容,但嵌套在子集合中或引用 我不知道如何通过引用根集合 (digitalContents) 添加或获取用户集合。

数据库结构

-root-

users<collection>
 uid<document>
  name:string<field>
  digitalContents:map[{
   digitalId:reference
   purchaceDate:timeStamp
  }]

digitalContents<collection>
  digitalId<document>
    name:string<field>
    price:number

数据库设计是否适合如何添加或获取上述用户集合,或者我应该怎么做? 如果你能教我,我将不胜感激。您可以 DI AngularFireStore 并获取集合。

对于给您带来的不便,我们深表歉意,但如果您能指导我们,我们将不胜感激。

与使用 NoSQL 数据库(更具体地说是 Firestore)相关的 best/worst 事情之一是,自从正确答案取决于您的具体实施。最接近规则的是建议避免对不同的集合进行多次读取,因为您需要为每个 read/write 付费。也就是说,对于您的具体情况,我认为您希望遵循一个名为 denormalization:

的过程

Database denormalization is the process of optimizing your database for reads by creating redundant data

我建议遵循的结构如下:

users (collection)
 |-- userid (document)
       |-- name
       |-- purchases (subcollection)
             |-- purchaseid (document)
                   |-- digitalID (reference)
                   |-- digitalName
                   |-- price
                   |-- purchasedDate

如您所见,我在每个 user 中重复了 digitalCollections 中的信息,这种结构背后有两个原因:

  1. (最明显的一个)我很确定你想保存所购买商品的价格,这是由于价格的一些变化与价格不一致用户购买时购买的商品,或者即使以折扣价购买的商品,这与目录价格不一致。

  2. 通过保存每个用户的所有购买,您可以简单地查询 purchases 子集合并获取所有这些,而无需进入不同的集合:

var purchases_by_user1 = db.collection('users/userid').collection('purchases');

或按具体购买查询:

var purchase_x_by_user1 = db.collection('users/userid').collection('purchases').doc('purchaseid');

还有一篇很棒的文章 video 解释了如何构建数据的一些前提条件,我希望这能让您明白并帮助您为您的用例选择正确的设计。