database-design - 单独的客户帐户的单个或单独的数据库?

标签 database-design

我正在开发一个从智能卡收集数据的应用程序。我希望能够将该应用程序作为多个客户帐户的 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/

相关文章:

MySQL 触发器无法更新触发器分配给的同一表中的行。建议的解决方法?

database - 单列/仅主键表的引用完整性?

java - 跟踪更改的数据库设计 - w/Hibernate

mysql - 我应该如何存储网站的链表类型数据?

sql - 数据库设计 : should nested objects have their own table?

sql - 大数据库的模式

mysql - 数据库设计——存储模板和实例的最佳方式

postgresql - 将数据库中特定架构上的所有内容授予 PostgreSQL 中的组角色

database - 你能在一个好的数据库模式中有 2 个具有相同结构的表吗?

php - 如何最好地处理重复日历事件的异常