我在思考数据库设计问题。任何帮助都将受到高度赞赏。
我们正在设计一个具有20个表格的应用程序(在新功能开发期间可能会增长到最多约30个)
技术堆栈
MVC4,.NET 4.X,实体框架5,SQL Server 2012,ASP.NET成员资格框架
用户数
我们打算迎合大约1000名平均有20位用户的客户。
问题
我们是否应该以对逻辑分区的方式设计数据库和应用程序,即所有客户端使用带有分区guid的相同表来分隔数据。
OR
转到多个数据库,这些数据库在新功能启动和错误修复期间可能会很难实现。但是可能允许缩放?
警告:其中一个表有一个存储文件的二进制列(每个记录最多5MB)
除此之外,我们还需要考虑Membership框架表,我们将扩展到另一个自定义表,并将用户逻辑映射到分区guid。
答案 0 :(得分:73)
您希望您使用过不同的数据库:
AND CustomerID = @CustomerID
。提示:使用脚本化权限工具或模式,或使用包含WHERE CustomerID = SomeUserReturningFunction()
或其中某些组合的视图包装所有表。Customer
之上设置一个抽象层,因为WHERE CustomerID = @CustomerID
现在不会将其删除。您会很高兴您使用了不同的数据库:
您希望使用过单个数据库:
仅仅因为我列出了更多的理由,并不意味着它更好。
有些读者可能会从这篇MSDN文章中获得价值:Multi-Tenant Data Architecture
答案 1 :(得分:7)
如果您将您的架构称为“多租户”,Microsoft有一篇很好的文章值得一读here。它显示了"isolated" (multiple db)
和"shared" (single db)
之间的一些比较。通常,当租户(客户)的数量很大时共享获胜,但是当每个租户的规模很大时,建议采用孤立的方法。
然而,这些考虑只能由有经验的开发人员计算。
如果您设法使用isolated (multiple db)
架构,仍然won't get direct benefit in performance when they are still run at same instance。如果您使用shared (single db)
架构,请考虑使用int
代替guid
,或sequential guid
,如果您仍需要使用它。