我正在研究从智能卡收集数据的应用程序。我希望能够将该应用作为多个客户帐户的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);
现在,如果我把一切都放在一个数据库,这意味着多个账户可以处理相同的CardHolders和SmartCards,但账户不应该看到其他数据。因此,智能卡在帐户中是唯一的,但不在整个数据库中。所以,每一个约束必须包括帐户ID,
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);
在实际的DB,就会有(由expirydate等等等等上市)更表,列和几个指标的载荷和帐户ID列都有处处纳入。
看起来有点混乱,首先把所有的帐户放在一个数据库中,然后通过在每个表中有一个AccountID列并将它们分开,并将每个约束和索引分开。我还需要查找或创建某种行级安全性,以防止用户访问其他帐户的数据。那么,我是否有为每个帐户创建单独数据库的有效借口,还是“真正的数据库设计师”总是将所有内容都保存在单个数据库中?
标记为答案,因为你的链接给了我最多的信息。我仍然无法决定该怎么做。我将开始为多个租户设计一个数据库,因为如果我改变主意,将其更改为隔离的数据库比将数据库重新设计为一个数据库设计更容易。 – Batibix 2010-12-16 19:28:26
这个链接真的很棒。我学到了很多。它应该是我可能购买的建立Saas的书的一部分。 – racl101 2015-10-21 23:30:04
真的希望你在这里发布这篇文章的肉,因为链接腐烂,现在这是一个死的答案。 – 2017-10-03 18:33:34