【问题标题】:Guidance for storing state in a database for a web application为 Web 应用程序在数据库中存储状态的指南
【发布时间】:2012-09-05 12:58:45
【问题描述】:

我有一些问题herehere ASP.NET MVC3 应用程序中的状态管理。其中一个答案提到,一个选项是简单地将每个步骤的状态存储在数据库中。

我想知道是否有人对通常如何实现这一点有任何建议,因为当我第一次向我建议时,我有一些想法。

无效实体

考虑一个包含 3 个步骤的多步骤表单(向导)。我可以将每个步骤保存在数据库中以维护状态,但用户可以在该过程中途关闭 Web 应用程序,使我的数据库包含处于无效状态的实体。

为了克服这个问题,我可以在表中添加一个字段来指示向导是否已完成。可以定期审查任何不一致的项目,并在需要时自动删除,例如如果在一天结束时在数据库中发现任何无效实体,它们将被自动删除。

这样做的问题是我必须向表中添加字段以存储有关应用程序的元数据。每个存储在多步骤表单中输入的信息的表都需要具有这些字段。这对我来说似乎是错误的。一种解决方案可能是创建一个特定的表来管理它,而不是用元数据污染每个实体表。

中间数据库

我想在我的应用程序和“真实”数据库之间建立一个数据库。 中间数据库将具有存储每个“步骤”的状态信息的表,并且只有当最后一步完成时,此信息才会传输到“真实”数据库(以及从中间删除的临时数据)。

这听起来也类似于 ASP.NET 已经提供的会话状态选项之一,所以我个人认为这会浪费时间。

在其他应用程序(例如桌面)中使用

目前,我的应用程序完全基于 Web,但我计划让桌面程序能够与同一个数据库进行交互。如果数据库具有 Web 应用程序用于存储状态的大量元数据,我的桌面应用程序需要知道这一点以避免任何错误(即我的桌面应用程序需要知道它必须设置实体状态为“有效”,以便 Web 应用程序不会在一天结束时删除该实体,因为它认为它是无效的)。

总结

那么有没有人有任何关于如何最好地使用数据库来存储应用程序状态的信息或提示?

  • 数据库选项很常见吗?
  • 它是否适合具有大量实体的大型应用程序?
  • 对性能有影响吗?

编辑

为了清楚起见,我知道在 ASP.NET MVC 应用程序中管理状态存在其他选项(TempData、缓存和会话),但我对有关使用数据库管理状态的信息特别感兴趣。

请不要对任何提到其他选项的人投反对票,因为我最初的问题可能对此并不清楚。

【问题讨论】:

    标签: asp.net-mvc-3 database-design wizard


    【解决方案1】:

    为什么不在会话状态中存储数据?您只需要想出一种机制,让您能够在会话状态中唯一标识和存储项目。

    首先,您可以使用 InProc 会话状态模式。随着系统的增长,您可以考虑将会话状态存储在状态服务器或 SQL 服务器上。

    【讨论】:

    • 我一直在考虑使用会话状态,因为它提供了我需要的功能,但到目前为止我发现的所有来源都提到性能可能很差。我还没有完全注销会话状态,但想权衡使用数据库方法的利弊。
    • 为什么性能会很差?这只是一个疯狂的猜测。这一切都取决于您正在运行的基础设施和您正在运行的负载。如果出现性能问题,那么您始终可以解决它们。使用 SQLServer 存储会话状态相当于使用“数据库方法”,优点是您可以立即获得大量功能。
    • +1 - 我的想法完全一样。今天早上我花了一些时间寻找一些数据来支持会话状态很慢但没有真正找到任何东西的说法。我也已经考虑过中间数据库选项与使用 SQL Server 数据库的会话状态基本相同。
    【解决方案2】:

    这是一个很难回答的问题,但基本上,我会看到两条路线。

    如果向导中给定步骤中的数据在逻辑上是正确的,并且满足您施加的所有约束,您可以将其写入您的“主”数据库。例如,如果您有一个管理订单的多步骤流程,并且第一步是创建一个客户记录(如果尚不存在),则在用户完成表单时将客户记录写入数据库。

    这意味着如果用户离开、关闭浏览器或其他任何事情,当他们回来时数据就会在那里——这可能是他们所期望的。

    如果给定步骤中的数据不一致、不符合约束等,请使用会话状态对其进行管理,直到它准备好写入数据库。 MVC 中的会话状态是a bit of a pain,您应该谨慎使用它——它使编写单元测试变得困难。

    会话状态的目的是存储与用户会话相关的数据,但这些数据(尚未)打算进入数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-25
      • 2012-09-04
      • 2012-03-18
      • 1970-01-01
      • 2010-10-08
      • 2013-10-19
      • 1970-01-01
      • 2012-12-16
      相关资源
      最近更新 更多