Database design 为每个帐户有多个用户的应用程序设计Firestore数据库

Database design 为每个帐户有多个用户的应用程序设计Firestore数据库,database-design,google-cloud-firestore,firebase-authentication,nosql,ngrx,Database Design,Google Cloud Firestore,Firebase Authentication,Nosql,Ngrx,我是一名UI开发人员,几乎没有数据库/后端经验。我正在使用Angular、NgRx、Firestore和Firebase Auth创建一个用于安排约会的应用程序。我已经做了一些研究,对如何设计NoSQL数据库有了大致的感觉,但我感觉我正在以一种奇怪的方式处理事情 到目前为止,我有一个工作前端,并已设置Firebase身份验证,因此我可以成功注册和登录。我的问题是找出一个好方法来知道每个用户与哪个帐户关联,因为每个帐户可能有许多用户。在更多上下文中,每个帐户都是一个公司,每个用户都是管理员、客户或

我是一名UI开发人员,几乎没有数据库/后端经验。我正在使用Angular、NgRx、Firestore和Firebase Auth创建一个用于安排约会的应用程序。我已经做了一些研究,对如何设计NoSQL数据库有了大致的感觉,但我感觉我正在以一种奇怪的方式处理事情

到目前为止,我有一个工作前端,并已设置Firebase身份验证,因此我可以成功注册和登录。我的问题是找出一个好方法来知道每个用户与哪个帐户关联,因为每个帐户可能有许多用户。在更多上下文中,每个帐户都是一个公司,每个用户都是管理员、客户或员工

我目前的解决方案虽然有效,但似乎有点老套,它是这样做的:

当管理员注册时,我在我的帐户集合中创建一个新帐户,并在我的用户集合中创建一个新用户,它是帐户的同级。我为新的account对象生成一个id,并在新的user对象中为accountId使用相同的id。每个用户还包含一个id,该id与通过Firebase身份验证生成的uid相匹配。 当用户登录时,我获取他们从Firebase Auth返回的uid,并使用该uid从我创建的users集合中查找具有匹配id的用户对象。从该对象中,我获取存储在其中的accountId,并将其用于所有API调用,以便获取特定于帐户的数据。 以下是我的数据的简化示例:

accounts: [
  { id: 'abc123', appointments: [...], clients: [...], employees: [], ... },
  { id: 'def456', appointments: [...], clients: [...], employees: [], ... },
  ...
];

// id matches uid from Firebase Auth.
// accountId is used to find which account to get data from
users: [
  { id: 'wmYUjdnJKks', accountId: 'abc123' },
  { id: 'yuRVjGnBLkm', accountId: 'def456' },
  ...
];
因此,如果我想获得某个特定帐户的所有约会列表,我将执行以下操作:

this.afs
  .collection('accounts')
  .doc(accountId)
  .collection<Appointment>('appointments')
  .get()
appointments: [
  { id: 'randomlyGenerated1', accountId: 'abc123', users: ['wmYUjdnJKks', 'user2'] },
  { id: 'randomlyGenerated2', accountId: 'def456', users: ['yuRVjGnBLkm', 'user4' },
  ...
];
我还没有弄清楚我将如何处理客户和员工的注册,并知道如何将他们与正确的帐户相关联


希望这不是一个错误的问题,但我不想采取一种不好的方法来设置所有这些,而只是在以后进行重大重构。如果有关于如何为这样的应用程序设置FiStury的建议,无论是对于管理员还是对于客户/雇员,都将非常感激。

< P>我认为您是在正确的轨道上,我会考虑将帐号重命名给公司或组织来消除用户和组织文档的歧义。
companies: [
  { id: 'abc123', appointments: [...], clients: [...], employees: [], ... },
  { id: 'def456', appointments: [...], clients: [...], employees: [], ... },
  ...
];

users: [
  { id: 'wmYUjdnJKks', accountId: 'abc123' },
  { id: 'yuRVjGnBLkm', accountId: 'def456' },
  ...
];
我认为您在尝试获取公共文档时选择了两种方法中的较好方法。您使用的方法是能够通过accountId查询约会

使用一种可以让您更轻松地适应特定于用户/基于权限的访问的方法(正如您所说的admins)变得更精细,就是存储一个有权访问给定文档的用户列表。这可能看起来像这样:

this.afs
  .collection('accounts')
  .doc(accountId)
  .collection<Appointment>('appointments')
  .get()
appointments: [
  { id: 'randomlyGenerated1', accountId: 'abc123', users: ['wmYUjdnJKks', 'user2'] },
  { id: 'randomlyGenerated2', accountId: 'def456', users: ['yuRVjGnBLkm', 'user4' },
  ...
];
如果管理员可以看到用户不应该看到的约会,则可以通过accountId查询,或者查询数组中包含用户ID的位置。这将涉及保持用户列表的更新

或者,您可以只给每个人一个角色并查询该角色。很好,您可以使用数字来定义角色,例如10=admin,并查询role>6。通过这种方式,您可以轻松设置权限阈值,但当然,您需要权衡特定于用户的权限