【问题标题】:Database for web app with multiple clients具有多个客户端的 Web 应用程序数据库
【发布时间】:2018-07-13 18:36:11
【问题描述】:

在现实世界的网络应用程序中,如何为多个客户/公司/客户存储数据?

假设我们有一个客户的以下集合:

- users
- tasks

如何将此系统扩展到第二个客户?有标准方法吗?

注意:我使用的是 Firestore (no-sql)。

【问题讨论】:

    标签: database angular database-design web-applications google-cloud-firestore


    【解决方案1】:

    我们为每个客户使用一组单独的集合。我们的数据结构非常适合我们,看起来像这样......

    /clients/{clientId}/reportingData
    /clients/{clientId}/billingData
    /clients/{clientId}/privateData
    

    使用安全规则,我们允许客户读取他们的 reportingData 和 billingData 集合,但不能读取 privateData 集合。

    但是,如果您需要同时跨多个客户端查询数据(例如供内部使用),那么使用 clientId 字段的 Frank 的选项 1 会更好。

    我们对用户做同样的事情......

    /users/{uid}/publicProfile(任何人都可以读,只有用户可以写)

    /users/{uid}/userProfile(只有用户可以读写)

    /users/{uid}/privateProfile(用户无法读写的内部数据)

    【讨论】:

    • 澄清一下,您是说在 FireStore 中“客户”是您的“集合”,其中包含每个“客户 ID”的“文档”。然后“reporting_data”是每个“client_id”“文档”中的“子集合”?
    • 是的。确切地。然后,您可以根据需要创建允许/限制用户访问这些详细信息的规则。
    • 真是天才!我不知道这是可能的。除了你提到的那个之外,这个解决方案还有什么缺点吗?
    • 如果有,那不是我们遇到的。一个普通的 noSQL 数据库需要你去规范化。 Cloud Firestore(我相信)在处理子集合(Cloud Datastore 除外)的方式上是独一无二的,这使得数据模型更加强大。然而,这些关于跨多个父文档查询的限制是我希望有一天可以实现的
    • 默认情况下,Cloud Firestore 读取很浅。当您获得整个 clients 集合时,Cloud Firestore 将仅返回 5 个文档。除非您单独单独请求,否则它不会返回任何子集合。
    【解决方案2】:

    在 Cloud Firestore 上实施此类多租户解决方案有多种选择:

    1. 将所有客户端放在一组集合中
    2. 为每个客户提供一组单独的集合
    3. 为每个客户制定一个单独的项目

    没有哪种方法可以更好或更差。

    我建议您至少考虑为每个客户制定一个单独的项目。将客户端彼此隔离,使维护和(可能在未来)计费变得更加容易。

    将所有客户端放在一组集合中也是可能的。您只需要确保客户端无法看到彼此的数据。由于您可能直接从客户端访问数据库,use security rules to ensure that clients can only access their own data

    【讨论】:

    • 选项 #2 怎么样?我将如何在 FireStore 中实现这一点?您会将“users_client1”、“tasks_client1”、“users_client2”、“tasks_client2”作为集合标题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2014-03-20
    • 2018-01-06
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多