Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 单独客户帐户的单个或单独数据库?_Database Design - Fatal编程技术网

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

Database design 单独客户帐户的单个或单独数据库?,database-design,Database Design,我正在开发一个从智能卡收集数据的应用程序。我希望能够将应用程序作为多个客户帐户的web服务运行。问题是,我应该为每个帐户创建一个单独的数据库,还是应该设计一个保存所有帐户数据的单一数据库?首先,我认为单一数据库是显而易见的答案,但它导致AccountID必须在表、索引、约束、查询、检查等任何地方使用 在这个应用程序中,没有一个字节的数据可以在帐户之间共享 首先,让我们看看一个帐户的单独数据库的外观: CREATE TABLE CardHolder ( CardHolderID int,

我正在开发一个从智能卡收集数据的应用程序。我希望能够将应用程序作为多个客户帐户的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);
在实际的数据库中,将加载更多的表、列和几个索引(用于按expirydate等列出),AccountID列必须包含在所有位置


对我来说,这似乎有点混乱,首先将所有帐户放在一个数据库中,然后通过在每个表和几乎每个约束和索引中都有一个AccountID列来分隔它们。我还需要找到或发明某种行级安全性,以防止用户访问其他帐户的数据。那么,我是否有正当理由为每个帐户创建一个单独的数据库,或者“真正的db设计器”是否总是将所有内容都保存在一个数据库中?

在设计多租户应用程序时,有几件事需要记在心上,如您的问题所述,包括模式设计,但包括许可证成本,还应考虑可扩展性等因素,包括正反两方面。看看吧


链接到文章的pdf版本:

我知道只有一种方法。多个数据库

  • 这不仅使永远不能共享的数据完全安全
  • 它还允许模式相互独立地更改。我的意思是,随着时间的推移,可能一个租户比其他所有的教师都大,因此必须满足特殊需求
  • 可以为独立的数据库轻松制定备份、恢复操作和策略
  • 约束和唯一性更容易表达,也更自然

  • 我们在这里走了两条路。我们为不需要定制的小型客户提供了一个共享数据库,为需要定制的企业客户提供了一个单独的数据库(以及应用程序代码库)

    两者各有优缺点。在共享数据库中,所需要的只是一个错误的查询,其中有人忘记使用clientid,并且数据会暴露给其他客户端。五年来,我只见过一次这种情况,但这是一场让我们失去了一个客户的噩梦。如果您这样做,请确保您有一个好的QA团队,在将代码发布到prod之前进行检查。如果您的数据库具有架构,则可以使用架构中的视图来阻止对其他客户端数据的数据访问。如果客户仅拥有其观点的权利,那么他们可以;我从来没见过别人的数据。不过,这需要做更多的工作

    但是,单独的数据库可能成为对其进行维护更改的噩梦。但是,如果您出售升级,这是一种方式,因为不是每个客户都会购买每个升级。只需确保您有一个良好的跟踪机制来了解每个客户端的版本,并使用源代码管理按版本跟踪所有数据库更改,以便轻松升级

    如果您不打算进行定制,您可能会发现,使用单独的数据库无论如何都会朝这个方向发展。当他们在共享数据库上时,告诉他们“不”要容易得多

    此外,我们还发现有一些定制对其他客户机很有帮助,但因为它们是在单独的应用程序和数据库中开发的,所以它们会由不同的团队为不同的客户机重新开发,最终会有6种方法来做同样的事情。这就成为跨客户机工作的人的一大难题,例如将客户机数据导入数据库的人。就我个人而言,我更喜欢一个数据库的方法


    关于需要合并或分离数据的另一点涉及数据报告。如果报告总是只由客户完成,那么您可以将它们分离出来,但是如果您需要使用合并数据进行报告(例如您自己的内部财务报告),那么如果您有一个合并的数据库,那么就容易多了。我之所以提出这个问题,是因为人们往往会在设计完成之前就忘记报告,这样做可能会导致一些非常严重的问题

    我不可能在每个租户都有独立的模式的情况下,不陷入一场维护噩梦,应用程序版本各异。是的,尤其是4,因为在单个数据库中,唯一性变得非常奇怪。从概念上讲,在单独的DBs中,一切似乎都更有意义。不过,我不确定维护和云托管成本。好吧,托管成本不是你问题的一部分:-)。我的答案令人满意吗?我不觉得在共享数据库中很难保持唯一性,只需将clientid列作为唯一约束的一部分。如果您有一个工具,可以使用配置文件设置数据库,那么这就不再是一个被标记为答案的问题,因为您的链接为我提供了最多的信息。尽管如此,我仍然无法决定该做什么。我将开始为多个租户设计一个DB,因为如果我改变主意,将其改为独立的DB要比将独立的DB改为一个DB设计容易得多。这个链接真的很棒。我学到了很多。这应该是我正在阅读的一本关于构建Saas的书的一部分