Sql server 构建基于web的业务应用程序应选择哪种策略

Sql server 构建基于web的业务应用程序应选择哪种策略,sql-server,asp.net-mvc,Sql Server,Asp.net Mvc,我计划在asp.net mvc中创建一个会计应用程序。 每个用户将支付每月订阅费,我将提供每日备份等 我不知道该选择哪种策略: 使用SQL CE4并在每个用户的单独虚拟目录中运行应用程序 将所有内容放在单个SQL Server数据库中 这两种选择的利弊是什么? 如果我选择选项2,我将不得不在代码中编写更多的逻辑。我必须防止用户看到他们不应该看到的东西(更多地访问数据库) 最重要的两件事是: 系统的总体性能 能够轻松为不同的用户创建备份 我预计有20到30个用户 如有任何建议,将不胜感激 我会一如

我计划在asp.net mvc中创建一个会计应用程序。
每个用户将支付每月订阅费,我将提供每日备份等

我不知道该选择哪种策略:

  • 使用SQL CE4并在每个用户的单独虚拟目录中运行应用程序
  • 将所有内容放在单个SQL Server数据库中
  • 这两种选择的利弊是什么?
    如果我选择选项2,我将不得不在代码中编写更多的逻辑。我必须防止用户看到他们不应该看到的东西(更多地访问数据库)

    最重要的两件事是:

  • 系统的总体性能
  • 能够轻松为不同的用户创建备份
  • 我预计有20到30个用户


    如有任何建议,将不胜感激

    我会一如既往地选择选项2。我有着强烈的金融一体化背景,所以选择2(至少对我来说)是最好的

    在考虑使用数据时,不存在con。没有比选项1更多的往返行程

    系统的性能通常由程序员决定。如果你写的代码糟糕透顶,你可能会期望糟糕的性能。选项2提供了最简单的备份选项,因为您只需担心1个数据库。如果你使用1数据库,就不需要考虑单独的用户。

    RE:往返是用户的(或者代码中更多的“逻辑”来处理),添加“Where userID=x”有多难


    无论如何,您都应该将.net代码与存储过程分开,这样从头开始编写就不会像使用选项1那样出现(甚至更少)往返/文件访问问题。

    我还是选择选项2。我有着强烈的金融一体化背景,所以选择2(至少对我来说)是最好的

    在考虑使用数据时,不存在con。没有比选项1更多的往返行程

    系统的性能通常由程序员决定。如果你写的代码糟糕透顶,你可能会期望糟糕的性能。选项2提供了最简单的备份选项,因为您只需担心1个数据库。如果你使用1数据库,就不需要考虑单独的用户。

    RE:往返是用户的(或者代码中更多的“逻辑”来处理),添加“Where userID=x”有多难


    无论如何,您都应该将.net代码与存储过程分离,这样从底层开始编写就不会再有(甚至更少)往返/文件访问问题比选项1更严重。

    如果在单个数据库中采用多租户设计,您可能无法实际使用SQL Server的备份功能,因为备份单元不足以单独备份每个用户的数据。您可以使用和文件组以及仅备份文件组,但分区功能并不容易管理,并且可能不适合此用途

    如果您希望为用户独立使用SQL Server的备份和恢复功能(从您的评论中听起来很像),那么您可能需要将它们放在单独的数据库中


    话虽如此,我还是会重新考虑这一要求(考虑实施选择性导出/导入),因为多租户体系结构总体上更容易处理。

    如果在单个数据库中进行多租户设计,您可能无法实际使用SQL Server的备份功能,因为备份单元不足以单独备份每个用户的数据。您可以使用和文件组以及仅备份文件组,但分区功能并不容易管理,并且可能不适合此用途

    如果您希望为用户独立使用SQL Server的备份和恢复功能(从您的评论中听起来很像),那么您可能需要将它们放在单独的数据库中


    话虽如此,我还是会重新考虑这一要求(考虑实施选择性导出/导入),因为多租户体系结构在总体上更容易处理。

    通过“轻松为不同的用户创建备份”,这些是逻辑备份吗,或者,您的意思是数据库的每个物理备份中只能有一个用户的数据吗?数据库的每个物理备份中只能有一个用户的数据。通过“轻松为单独的用户创建备份”,这些是逻辑备份吗,或者,您的意思是数据库的每个物理备份中应该只有一个用户的数据?数据库的每个物理备份中必须只有一个用户的数据。+1是的,在每个查询中添加一个额外的“Where userID=X”,我将减少往返次数。谢谢。@šljaker为了加强这一点并避免在某些查询中意外关闭租户ID,您可以使用内联表值函数包装基表,这些函数每次都需要提供租户ID。ITVF的开销类似于视图(即最小),优化器可以非常轻松地处理它们。@ljaker使用TVF包装每个表:CREATE函数fTABLENAME(@TenantID int)将表返回为RETUEN(选择*FROM TABLENAME,其中TenantID=@TenantID)。然后只使用以下函数:从fCust(@tentandi)中选择*作为c内部联接帐户(@TenantID)作为a.CustID=c.CustIDI建议不要这样做,因为如果设计不当,“视图”的开销会很大。这样做的目的是减少往返次数,但在这种情况下,你创造了更多。如果您想让您的应用程序在不需要升级硬件或重新编程的情况下增长,只需从一开始就“正确”地添加userID=在需要的地方。我目前正在做一个既有用户又有公司(用户链接到公司)的应用程序,因为我从一开始就设计它来处理多个公司及其用户,所以我可以添加新的com