Mysql 500个数据库还是一个包含500个表的数据库,还是只有一个包含所有记录的表?
我目前有一个由单一终端客户使用的应用程序。为了便于讨论,假设应用程序只需要一个数据库表来存储所有记录。我现在需要支持多租户,因此将来我将有大约500个客户使用同一个数据库服务器 1) 一个可能的解决方案是为每个客户提供一个单独的数据库。因为将有大约500个客户,这意味着拥有MySQL/SQL Server/Oracle/etc。。。托管500个独立的数据库。对于运行在基于云的普通服务器上的数据库服务器来说,这听起来有点过头了 2) 另一个解决方案是坚持使用我已有的单一数据库,但要有500个不同的表,每个终端客户一个表。每个客户在他们自己的表中平均只有大约2000条记录。这很容易实现,我想这会使将客户迁移到另一台服务器变得很容易,只需将整个表数据移到另一台服务器上即可 3) 最后,我可以坚持在单个数据库中使用单个表。相反,我添加了一个额外的列来标识记录所属的客户。但是,这个表最终会有大约1000000条记录,这是所有500个客户的总和,平均每个客户有2000条记录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个不同的
我对性能和伸缩性了解不够,不知道1、2、3将提供最佳性能。有什么想法吗?一般来说,在任何数据库场景中,选项2都被认为是糟糕的设计风格。关于设计数据库,有一条规则规定,相同类型的数据通常应存储在同一个表中(即,不要创建两个或多个表来存储同一数据库中相同类型的记录) 至于1和3之间的选择,实际上可以归结为您希望做什么:
从性能的角度来看,几千条记录算不了什么。即使您有几千个客户(1000 x 1000->上百万或上千万),只要数据被正确索引并且硬件是半正常的(即,一个私有服务器,而不是共享服务器),您仍然可以使用单个数据库进行管理。但从长远来看,其他考虑因素(新功能、更多客户或更多数据)可能会证明每个客户使用一个数据库更有意义。一般来说,在任何数据库场景中,选项2都被认为是糟糕的设计风格。关于设计数据库,有一条规则规定,相同类型的数据通常应存储在同一个表中(即,不要创建两个或多个表来存储同一数据库中相同类型的记录) 至于1和3之间的选择,实际上可以归结为您希望做什么:
从性能的角度来看,几千条记录算不了什么。即使您有几千个客户(1000 x 1000->上百万或上千万),只要数据被正确索引并且硬件是半正常的(即,一个私有服务器,而不是共享服务器),您仍然可以使用单个数据库进行管理。但从长远来看,其他考虑因素(新功能、更多客户或更多数据)可能会证明每个客户使用一个数据库更有意义。一般来说,在任何数据库场景中,选项2都被认为是糟糕的设计风格。关于设计数据库,有一条规则规定,相同类型的数据通常应存储在同一个表中(即,不要创建两个或多个表来存储同一数据库中相同类型的记录) 至于1和3之间的选择,实际上可以归结为您希望做什么:
: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