【问题标题】:Database table creation for large data大数据的数据库表创建
【发布时间】:2013-07-04 08:45:35
【问题描述】:

我正在制作一个客户端管理应用程序,其中存储了employeeadmincompany 的数据。未来该数据库将有数百家公司注册。我正在考虑寻找数据库设计的最佳方法。

我可以想到两种方法:

  1. 为每家公司分别制作应用的所有表格
  2. 将所有数据存储在应用数据库中

您能建议最好的方法吗?

请注意,所有 3 个表都基于 id 链接,并且将有数百家公司,每个公司将有很多 admin,每个 admin 将有数百名员工。处理安全性和查询性能的最佳方法是什么

【问题讨论】:

    标签: database multi-tenant


    【解决方案1】:

    这是我分享最多的网络业务服务的一个经典问题:对于所涉及的因素的讨论,谷歌“多租户架构”。

    您几乎肯定希望将所有公司放入一组公用表中:每个数据表都应引用公司键,并且所有查询都应加入该键以及其他条件。这可以实现最佳的整体性能,并为您节省数百次重复视图、存储过程等的潜在维护噩梦,或者如果您希望添加字段或表,则必须对数百个表应用相同的结构更改.

    为帮助确保您不会无意中混合来自不同客户的数据,通过一组经过验证的存储过程(所有这些都将公司 ID 作为参数)进行所有数据访问可能会很有用。

    数百个并行数据库无法很好地扩展:数据库服务器会不断地将表和索引从内存中推出以适应下一个查询,从而导致磁盘抖动和性能下降。这条路只有痛苦。

    【讨论】:

      【解决方案2】:

      根据您提供的部分信息,您似乎需要 3 个规范化表,以及查找和其他内容等辅助数据。

      但是当你设计一个数据库时,你需要考虑更多的点,比如安全性、可见性、客户端访问方法等

      例如,如果您想确保隔离,并且不允许用户看到其他人的数据,您可以为每个公司动态创建一个架构,为每个架构动态创建用户和访问权限。然后你需要在 DAL 中支持这些东西,实际上它们会很胖。

      DAl 的另一种方法是公开总是返回一个公司的子集的视图。

      我建议采用标准化方法的一个重要原因是这样维护会容易得多。

      从 SQL 的角度来看,我认为拥有许多表或只有 3 个表没有任何性能优势,索引的效率和智能 DAL 会有所作为。

      【讨论】:

      • 感谢您的回复。所以场景是我将拥有数百家公司,每家公司都会有很多管理员,每个管理员都有数百名员工。现在你说我应该将所有值存储在 3 个表中,或者我为每个公司制作 3 个表的副本。如果我制作副本,数据将更有条理。你说什么
      • @user1224233 相反,我并不是说在许多相似的表中拥有数据会使事情更有条理,它只会从安全角度来看有一些好处,但这需要很多更多的努力去创造和维护。在这种特定情况下,很少有规范化的表会更有条理。
      • 我完全同意你的观点,我认为单独的表格只是安全问题。在我的场景中,每家公司都与另一家公司没有联系,在第二种方法中,仅将所有数据放在 3 个表中,我考虑安全问题和查询响应时间,因为这可能是因为只有一家公司拥有如此多的数据,而且仅仅是因为该查询延迟发生
      • 安全性可以通过仅通过视图提供可见性来处理。数据库架构不需要与您向客户显示的相同。由于您没有提供有关您打算使用的环境的任何信息,因此我的建议非常有限,并且我坚持笼统。至于性能,我认为对数据库的查询不会对不同公司的数据产生太大影响,现代 DBMS 现在已经对它们进行了非常好的管理,如果您期望大量数据,您应该已经为大数据和NOSql
      • 非常感谢您的回复,您的消息真的很有帮助,环境将是网络 + 移动应用程序。所以我认为我应该对所有三个表进行聚集索引,并将所有公司的数据仅存储在 3 个表中,并检索安全性,我将用户查看
      【解决方案3】:

      查询的性能在很大程度上取决于表的大小,但更多地取决于您对该表的索引。所以你需要根据你的要求放置聚集索引和非聚集索引,我可以保证你不会遇到任何问题 10 GB 的数据

      【讨论】:

      • 我读到了聚集索引,它说它将把值存储在另一个表附近,所以我有所有三个表相互链接,所以我会为所有三个表建立聚集索引。如果我错了,请纠正我。谢谢
      【解决方案4】:

      您根本没有说这些数据是如何链接的,或者它们之间是否存在任何链接。但是,猜测一下,您需要 3 个表。

      1. 员工表
      2. 管理表
      3. 公司表

      每个都有所需的属性,如果没有其他信息,我无法提供更多指导。

      【讨论】:

        【解决方案5】:

        根据您的应用程序的用例,没有“最佳”方式。 请说明您的应用程序将提供的操作,以便我们进一步了解您的问题。

        要存储的数据似乎是结构化的,因此乍一看关系数据库会很好用,但请坚持我上面标记的点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-15
          • 1970-01-01
          • 2012-05-15
          • 2013-03-07
          • 2014-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多