我应该为每个用户创建单独的sql server数据库吗?

问题描述 投票:1回答:3

我正在使用Asp.Net MVC Web应用程序,后端是sql server 2012。

此应用程序将提供帐单,会计和库存管理。用户将通过注册创建帐户。就像http://www.quickbooks.in。每个用户将创建一些主数据和各种事务。没有限制,用户可以在数据库中进行无限记录。

我想在繁重的数据负载后保持稳定的数据库性能。我在其中维护了正确的索引编制和主键,但是每个用户在数据库上将承受沉重的负担。

因此,我应该为每个用户创建一个单独的数据库,还是应该使用UserID维护一个数据库。在每个表中添加UserID并基于UserID进行分区?

我不是Sql Server方面的专家,所以请提供具有明确规范的建议。

如果缺少任何信息,请通知我。

sql sql-server database database-design database-schema
3个回答
2
投票

每个用户一个数据库就是当客户需要打包并离开他们随身携带实际数据库时发生的情况。想想一个自托管的WordPress网站。或者,如果一个用户意外看到另一位用户的数据存在巨大的风险,那么依靠服务器安全性模型要比依靠记住将UserId过滤器添加到所有查询中更为安全。我无法想象这样的情况,但是谁知道呢?也许,如果隐私法允许入狱,我宁愿将数据按安全规则划分,而不是仔细地编写WHERE子句。

如果您确实按每个数据库使用过用户,那么创建新用户的工作量将增加10倍。尽管INSERT,UPDATE等在版本之间保持不变,但随着每次升级,数据库语法,用户创建,权限授予等将发展到足以破坏每次SQL版本升级的那些脚本。

此外,这会使您的迁移麻烦乘以用户数量。假设您有5000个用户,并且需要添加一些新列,更改列数据类型,更新触发器等等。无需运行1x更改脚本,而是需要运行5000次。

每个用户Db也可能浪费磁盘空间。这些数据库中的每一个都将有一个事务日志,空闲时将占用最小的日志空间。

关于负载,如果总共您的5000个用户每天要进行10亿次插入,更新等操作,我的直觉告诉我,除非有某种扩展性问题(每个人阅读和阅读,同时写入同一张表和同一张表的同一页)。每个数据库在做家务时每个数据库都有机器资源(可能是线程和内存),因此这些额外的DB不能免费使用。

无论如何,最好的方法是模拟这两种体系结构,并使用随机数据生成器模拟负载并查看其性能。


2
投票

这不是一个容易给出的答案。

首先,要考虑逻辑设计。然后,您将具有完整性,安全性,管理和性能(按此顺序)。

数据库是自包含的逻辑数据单元。理想情况下,您应该能够使用数据库,将其移至另一个实例,可能会更改连接字符串并再次运行。所有约束都是数据库级别的。不能存在引用数据库外部某些对象的外键。因此,请尝试首先考虑这些术语。

您将如何可靠地防止一个用户弄乱另一用户的数据?请记住,有人打开excel工作表并绕过您的应用程序对数据库进行查询只是时间问题。您不想处理SQL Server中的行级安全性。

[多个数据库意味着所有脚本管理任务都应编写成脚本并在所有数据库上执行。是的,这有一些开销,但是一旦设置好,就只需要进行监视。如果数据库变得可疑,那就是单个客户宕机,而不是全部。如果每个客户都有自己的数据库,甚至可以为不同的习惯使用不同的版本。此外,如果您进行升级,则可以按客户进行升级,因此影响不大。

性能是此处最不相关的因素。当然,这实际上取决于有多少客户和多少数据,但是正确的索引编制将解决这些问题。使用多个数据库可以更轻松地进行横向扩展。

顺便说一句,分区,就像您提到的那样,永远不会提高性能,它只是管理功能,可以更快地从表中加载和逐出数据。

我可能将每个客户都放在单独的数据库中,但是最终要由您自己决定。希望我对此有所帮助。


0
投票

quickbooks desktop pro 2020是专门为满足中小型企业的需求而设计的会计软件。企业可以使用此软件来创建发票,管理帐户并生成对帐单]

© www.soinside.com 2019 - 2024. All rights reserved.