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

问题描述

我们正在寻找一种机制,允许用户使用Angular 10购买数字内容

我正在考虑如何通过在digitalcontents.service.ts中引用以下内容,但通过嵌套在子集合中或通过引用来使用Angular 10和Cloud Firestore与引用类型创建1:N关系 我不知道如何通过引用根集合(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)的使用有关的最好/最坏的事情之一是,没有正确或错误的数据结构规则,因为正确的答案取决于您的具体情况。实施。与规则最接近的一条建议是避免对不同集合进行多次读取,因为每次读取/写入都要付费。也就是说,对于您的具体情况,我认为您希望遵循一个名为denormalization的过程:

数据库非规范化是通过创建冗余数据来优化数据库以进行读取的过程

我建议遵循的结构如下:

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

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

  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,它解释了如何构造数据的一些前提,希望这一点可以弄清楚,并帮助您为用例选择正确的设计。