我正在研究Asp.Net MVC Web应用程序,后端是sql server 2012.
此应用程序将提供结算,会计和库存管理。用户将通过注册创建帐户。就像http://www.quickbooks.in一样。每个用户将创建一些主人和各种交易。没有限制,用户可以在数据库中创建无限记录。
我希望在数据加载繁重后保持稳定的数据库性能。我正在维护正确的索引和主键,但每个用户的数据库负载很重。
因此,我应该为每个用户创建单独的数据库,还是应该使用UserID维护一个数据库。在每个表中添加UserID并根据UserID进行分区?
我不是Sql Server的专家,所以请提供明确规范的建议。
如果缺少信息,请通知我。
答案 0 :(得分:2)
每个用户的数据库是当客户需要能够打包并随身携带实际数据库时发生的情况。想想一个自我托管的wordpress网站。或者,如果一个用户意外地看到另一个用户的数据存在难以置信的风险,那么依赖服务器安全模型比依赖记住将UserId过滤器添加到所有查询更安全。我无法想象这样的情况,但是谁知道 - 也许如果隐私法允许进入监狱时间,我宁愿按安全规则划分数据,而不是仔细编写WHERE条款。
如果您确实使用了每个数据库的用户数,那么创建新用户的工作量将增加10倍。虽然INSERT,UPDATE等在版本之间保持不变,但每次升级时,数据库,用户创建,权限授予等语法都将发展到足以破坏每个SQL版本升级的脚本。
此外,这会使您的迁移头痛乘以用户数。假设您有5000个用户,您需要添加一些新列,更改列数据类型,更新触发器等等。不需要运行1x的更改脚本,而是需要运行5000次。
每个用户Dbs也可能浪费磁盘空间。每个数据库都将有一个事务日志,空闲占用最小的日志空间。
至于负载,如果你的5000个用户每天集中进行10亿次插入,更新等等,我的直觉告诉我它会在一个数据库上更快,除非存在某种争议问题(每个人同时读同一个表和同一个表的相同页面)。每个数据库都有每个数据库执行内务处理的机器资源(可能是线程和内存),因此这些额外的数据库不能免费。
无论如何,最好的办法是模拟这两种体系结构,并使用随机数据生成器来模拟负载并查看它们的执行情况。
答案 1 :(得分:1)
这不是一个简单的答案。
首先,需要考虑逻辑设计。然后,您就拥有了诚信,安全,管理和绩效(按此顺序)。
数据库是数据的逻辑单元,是自包含的。理想情况下,您应该能够获取数据库,将其移动到另一个实例,可能会更改连接字符串并再次运行。 所有约束都是数据库级的。没有外键可以引用数据库外部的某个对象。 所以,先尝试用这些术语思考。
您如何可靠地防止一个用户弄乱其他用户的数据?请记住,有人打开Excel工作表并在数据库上启动查询绕过您的应用程序只是时间问题。 SQL Server中的行级安全性是您不想处理的。
多个数据库意味着应该编写所有管理任务并在所有数据库上执行。是的,它有一些开销,但一旦你设置它只是监控的问题。如果数据库出现问题,那么它就是单个客户,而不是所有客户。如果每个客户拥有自己的数据库,您甚至可以为不同的客户提供不同的版本。此外,如果您进行升级,则可以按照客户进行升级,因此inpact将会更少。
性能是这里最不相关的因素。当然,这实际上取决于有多少客户和多少数据,但正确的索引将解决这些问题。使用多个数据库时,横向扩展会更容易。
顺便说一句,正如你所提到的,分区从来就不是一个性能助推器,它只是一个管理功能,允许更快地加载和驱逐表格中的数据。我可能会将每个客户都放在不同的数据库中,但最终由您决定自己做出决定。希望我能帮助一些人。