Mysql 500个数据库还是一个包含500个表的数据库,还是只有一个包含所有记录的表?

Mysql 500个数据库还是一个包含500个表的数据库,还是只有一个包含所有记录的表?,mysql,sql-server,oracle,performance,scaling,Mysql,Sql Server,Oracle,Performance,Scaling,我目前有一个由单一终端客户使用的应用程序。为了便于讨论,假设应用程序只需要一个数据库表来存储所有记录。我现在需要支持多租户,因此将来我将有大约500个客户使用同一个数据库服务器 1) 一个可能的解决方案是为每个客户提供一个单独的数据库。因为将有大约500个客户,这意味着拥有MySQL/SQL Server/Oracle/etc。。。托管500个独立的数据库。对于运行在基于云的普通服务器上的数据库服务器来说,这听起来有点过头了 2) 另一个解决方案是坚持使用我已有的单一数据库,但要有500个不同的

我目前有一个由单一终端客户使用的应用程序。为了便于讨论,假设应用程序只需要一个数据库表来存储所有记录。我现在需要支持多租户,因此将来我将有大约500个客户使用同一个数据库服务器

1) 一个可能的解决方案是为每个客户提供一个单独的数据库。因为将有大约500个客户,这意味着拥有MySQL/SQL Server/Oracle/etc。。。托管500个独立的数据库。对于运行在基于云的普通服务器上的数据库服务器来说,这听起来有点过头了

2) 另一个解决方案是坚持使用我已有的单一数据库,但要有500个不同的表,每个终端客户一个表。每个客户在他们自己的表中平均只有大约2000条记录。这很容易实现,我想这会使将客户迁移到另一台服务器变得很容易,只需将整个表数据移到另一台服务器上即可

3) 最后,我可以坚持在单个数据库中使用单个表。相反,我添加了一个额外的列来标识记录所属的客户。但是,这个表最终会有大约1000000条记录,这是所有500个客户的总和,平均每个客户有2000条记录


我对性能和伸缩性了解不够,不知道1、2、3将提供最佳性能。有什么想法吗?

一般来说,在任何数据库场景中,选项2都被认为是糟糕的设计风格。关于设计数据库,有一条规则规定,相同类型的数据通常应存储在同一个表中(即,不要创建两个或多个表来存储同一数据库中相同类型的记录)

至于1和3之间的选择,实际上可以归结为您希望做什么:

  • 为每个最终用户创建一个独立的解决方案

    从长远来看,这可能会更清洁、规模更大。它还将帮助您处理交叉污染,并为数据创建有效的备份策略。此外,它还有助于确保,如果您选择清除(放弃)一个用户的数据,您不会意外删除其他用户的数据

    因此,我认为选项1-每个客户端一个数据库在大多数情况下都更好

  • 创建一个作为产品(即软件即服务)为多个客户维护的单一解决方案

    在这种情况下,如果您确定每个客户将生成少量数据,则可以选择将数据存储在单个表中,供多个客户使用。但即使在那里,创建多个数据库也可能会更好。然而,这取决于其他因素(你的预算就是其中之一)


  • 从性能的角度来看,几千条记录算不了什么。即使您有几千个客户(1000 x 1000->上百万或上千万),只要数据被正确索引并且硬件是半正常的(即,一个私有服务器,而不是共享服务器),您仍然可以使用单个数据库进行管理。但从长远来看,其他考虑因素(新功能、更多客户或更多数据)可能会证明每个客户使用一个数据库更有意义。

    一般来说,在任何数据库场景中,选项2都被认为是糟糕的设计风格。关于设计数据库,有一条规则规定,相同类型的数据通常应存储在同一个表中(即,不要创建两个或多个表来存储同一数据库中相同类型的记录)

    至于1和3之间的选择,实际上可以归结为您希望做什么:

  • 为每个最终用户创建一个独立的解决方案

    从长远来看,这可能会更清洁、规模更大。它还将帮助您处理交叉污染,并为数据创建有效的备份策略。此外,它还有助于确保,如果您选择清除(放弃)一个用户的数据,您不会意外删除其他用户的数据

    因此,我认为选项1-每个客户端一个数据库在大多数情况下都更好

  • 创建一个作为产品(即软件即服务)为多个客户维护的单一解决方案

    在这种情况下,如果您确定每个客户将生成少量数据,则可以选择将数据存储在单个表中,供多个客户使用。但即使在那里,创建多个数据库也可能会更好。然而,这取决于其他因素(你的预算就是其中之一)


  • 从性能的角度来看,几千条记录算不了什么。即使您有几千个客户(1000 x 1000->上百万或上千万),只要数据被正确索引并且硬件是半正常的(即,一个私有服务器,而不是共享服务器),您仍然可以使用单个数据库进行管理。但从长远来看,其他考虑因素(新功能、更多客户或更多数据)可能会证明每个客户使用一个数据库更有意义。

    一般来说,在任何数据库场景中,选项2都被认为是糟糕的设计风格。关于设计数据库,有一条规则规定,相同类型的数据通常应存储在同一个表中(即,不要创建两个或多个表来存储同一数据库中相同类型的记录)

    至于1和3之间的选择,实际上可以归结为您希望做什么:

  • 为每个最终用户创建一个独立的解决方案

    从长远来看,这可能会更清洁、规模更大。它还将帮助您处理交叉污染,并为数据创建有效的备份策略。此外,它还有助于确保,如果您选择清除(放弃)一个用户的数据,您不会意外删除其他用户的数据

    因此,我认为选项1-每个客户端一个数据库在大多数情况下都更好

  • 创建一个为多个客户维护的单一解决方案,作为一个产品(即。
    :setvar MySchemaName "Customer001"
    
    if not exists(select 1 from information_schema.schemata where schema_name='$(MySchemaName)')
    BEGIN
        EXEC ('CREATE SCHEMA $(MySchemaName) AUTHORIZATION dbo;')
    END
    
    GO
    
    IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = N'$(MySchemaName)' and TABLE_NAME = N'Employee' and TABLE_TYPE = N'BASE TABLE' ) 
    BEGIN 
    DROP TABLE [$(MySchemaName)].[Employee] 
    END 
    GO
    
    
    CREATE TABLE [$(MySchemaName)].[Employee] ( 
    
        [EmployeeUUID] [uniqueidentifier] NOT NULL,
        [ParentDepartmentUUID] [uniqueidentifier] NOT NULL,
        [TheVersionProperty] [timestamp] NOT NULL,
        [SSN] [nvarchar](11) NOT NULL,
        [LastName] [varchar](64) NOT NULL,
        [FirstName] [varchar](64) NOT NULL,
        [CreateDate] [datetime] NOT NULL,
        [HireDate] [datetime] NOT NULL
        )
    
    GO