【问题标题】:Where to store Shopping Cart in MVC Application?在 MVC 应用程序中将购物车存储在哪里?
【发布时间】:2014-08-25 13:31:06
【问题描述】:

我正在开发一个铁路门户网站,需要维护一个包含用户选择的组件的购物车,购物车中可能有多个不同类型的组件。我看不到将购物车存储在数据库中的价值,想将最终订单存储在数据库中。在 MVC 中,我可以在哪里存储/保存(临时)每个用户会话的购物车数据?我在网上看到的所有 MVC 示例都将购物车数据保存在数据库中——不知道为什么。

MVC 表示层将与外部 Web 服务通信以了解这些组件的定价和可用性,因此我不能只存储产品 ID 来在购物过程中查找实际产品描述/价格...我有将购物车中的所有内容(产品 ID、描述、价格等)存储在内存中的某个位置。我的应用程序将在 WEB FARM 环境中运行,并且不能使用进程内会话存储。 我想到的选项是:

  1. SQL SERVER 中的会话状态
  2. 使用某种分布式缓存机制来存储会话数据,例如“Windows Server AppFabric”

【问题讨论】:

  • 3.将其存储在您的应用程序服务器上 - 在内存中(如果有的话) - 也就是说,如果您使用粘性负载平衡。我只会将它存储在数据库中 - 对于批量购买的普通客户来说,这是一个不错的功能。

标签: c# asp.net asp.net-mvc


【解决方案1】:

始终可以选择将此数据存储在加密的客户端 cookie 中。 Ruby on rails 可以做到这一点,并且可以很好地扩展。

请参阅http://agilewebdevelopment.com/plugins/encrypted_cookie_store 了解有关 Ruby 是如何做到这一点的更多详细信息。不知道您将如何使用 ASP.Net MVC 实现这一点。

【讨论】:

  • 如果您使用加密的 cookie,您需要非常小心 cookie 的大小,一旦开始超过 1KB,您的网站上就会随机出现非常糟糕的事情。
  • 当然,这不是小事。您真正需要考虑的另一件事是加密。请参阅 stackoverflow.com/questions/667887/aes-in-asp-net-with-vb-net 以获得很好的解释。
【解决方案2】:

购物车存储在数据库中,因此如果需要,它可以跨会话持久化。

此外,通过将其存储在数据库中,您可以获得可以查询的其他信息,例如我的客户想要哪些他们尚未购买的商品?

即使您现在不想要该功能,也请将其放入数据库中,因为稍后添加该功能将更加困难,而前期则相当容易。

【讨论】:

  • 我同意您的建议,即研究“我的客户想要哪些他们尚未购买的商品?”很有帮助。但正如我在问题中所说,我的应用程序与外部 Web 服务对话以查询这些产品,它们维护大量日志并为此类研究提供统计工具。我的应用程序将被大量使用,高可用性和性能将是我的应用程序的关键。为从购物车中添加/删除的每个组件在数据库中/从数据库中存储和检索购物车让我担心很多数据库命中和性能问题......请提出建议。
  • 如果您使用SqlServer 会话(我推荐),存储在会话中仍然会将购物车放入数据库中。它实际上为存储在会话中的任务添加了一个额外的序列化组件,因此可以说速度较慢。
  • 所以...将购物车数据存储在 DB 中并在 cookie 中存储相应的 GUID(以检索购物车)会比在 SQL SERVER 中使用 SESSION STATE 更好,因为稍后会做同样的事情,但会产生开销的序列化。如果我能够弄清楚并利用 AppFabric,那么将购物车存储在数据库中会是更好的选择吗?
【解决方案3】:

购物车是文档数据库的完美搭配。我建议初学者先看看 RavenDB、Redis、MongoDB、CouchDB。

如果您想要极致性能,那么您已经有了使用 App Fabric 的想法,之后您可以将购物车保存到任何耐用的商店,因为那时性能是一个相对没有实际意义的问题。

【讨论】:

  • 感谢 Chris,我将在 App Fabric 上进行更多探索,因为我想在我的应用程序中利用广泛的缓存来避免(明智地)对外部 Web 服务的调用次数。我希望 App Fabric 也可以用于存储每个用户会话的购物车,并且可以在网络农场中使用。
  • 我还没有使用过 App Fabric,但您的最后一句话是它存在的全部原因。我提出文档数据库的原因是使用它们,您可能根本不需要为购物车实现缓存,因为这些商店是为在这种负载下提供服务而开发的,并且通过正确应用该技术毫不费力。
【解决方案4】:

虽然将购物车作为加密字符串存储在隐藏字段中很诱人,但这是错误的,因为大多数用户希望他们的购物车保留其状态。

想象一下,如果亚马逊的购物车没有在会话期间持续存在。他们不会卖那么多书、电子产品或其他东西。

如有疑问,请查看成功的等效网站,看看他们做了什么。这适用于生活中的所有事物,而不仅仅是网站。

【讨论】:

  • PHP 直到最近还存在一个缺陷,会话 cookie 使用了一个非常简单的随机数生成器,该生成器可以从 140 位(或其他东西)减少到 20 位。其余的可以猜到。成功并不总是衡量正确性的好方法:)(小心使用 ID cookie!)youtube.com/watch?v=XQcW1zYiqdU
  • 谁说我为此宣传 cookie?你的评论和我的回答有什么关系?
  • 我的意思是,从原则上讲,仅仅模仿成功并不是一个好主意,尤其是在这种情况下。 cookie 示例是偶然的,显然我们都没有推广 PHP。
【解决方案5】:

在数据库中存储购物车详细信息 和 cookie 中的购物车引用,用于识别特定浏览器/客户端。

例如

tblCart (refId,proId,qty)

refId 和 ProId 将是主键。

refId 存储在 cookie 中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-16
    • 2012-07-29
    • 1970-01-01
    • 2017-06-23
    • 2023-04-03
    • 2016-09-27
    • 2013-11-20
    • 2021-05-03
    相关资源
    最近更新 更多