我正在开发一个从智能卡收集数据的应用程序。我希望能够将该应用程序作为多个客户帐户的 Web 服务运行。问题是,我应该为每个帐户创建一个单独的数据库,还是应该设计一个包含所有帐户数据的数据库?首先,我认为单个数据库是显而易见的答案,但结果是 AccountID
必须在几乎所有地方使用,在表、索引、约束、查询、检查等中。
在此应用程序中,没有要在帐户之间共享的单个字节数据。
首先,让我们看看一个帐户的单独数据库的外观:
CREATE TABLE CardHolder (
CardHolderID int, -- primary key
CardHolderUniqueName nvarchar(30) );
CREATE TABLE SmartCard (
SmartCardID int, -- primary key
CardHolderID int,
CardUniqueName nvarchar(30) );
再加上一些唯一性约束,
ALTER TABLE CardHolder ADD CONSTRAINT UQ_CardHolderName UNIQUE (CardHolderUniqueName);
ALTER TABLE SmartCard ADD CONSTRAINT UQ_CardName UNIQUE (CardUniqueName);
现在,如果我将所有内容都放在一个数据库中,这意味着多个帐户可以处理相同的持卡人和智能卡,但这些帐户不应看到彼此的数据。因此,智能卡在帐户中是唯一的,但在整个数据库中不是。因此,每个约束都必须包含一个 AccountID,
CREATE TABLE CardHolder (
CardHolderID int, -- primary key
CardHolderUniqueName nvarchar(30),
AccountID int );
CREATE TABLE SmartCard (
SmartCardID int, -- primary key
CardHolderID int,
CardUniqueName nvarchar(30)
AccountID int );
ALTER TABLE CardHolder
ADD CONSTRAINT UQ_CardHolderName UNIQUE (AccountID, CardHolderUniqueName);
ALTER TABLE SmartCard
ADD CONSTRAINT UQ_CardName UNIQUE (AccountID, CardUniqueName);
在实际的数据库中,会有更多的表、列和几个索引(用于按到期日等列出)加载,并且必须在任何地方都包含 AccountID 列。
对我来说似乎有点困惑,首先将所有帐户放在一个数据库中,然后通过在每个表和几乎每个约束和索引中都有一个 AccountID 列来将它们分开。我还需要找到或发明某种行级安全性,以防止用户访问其他帐户的数据。那么,我是否有为每个帐户创建单独数据库的正当理由,或者“真正的数据库设计者”是否总是将所有内容都保存在一个数据库中?
最佳答案
在设计 Multi-Tenancy 应用程序时,有几件事需要牢记,包括正如您的问题所述,架构设计,但还应考虑许可成本、可扩展性等事项。 This article describes the three most common approaches for designing a multi-tenant application ,包括优点和缺点。检查一下。
链接到文章的 pdf 版本:http://ramblingsofraju.com/wp-content/uploads/2016/08/Multi-Tenant-Data-Architecture.pdf
关于database-design - 单独的客户帐户的单个或单独的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4449621/