gpt4 book ai didi

asp.net - IsChanged 功能应该在哪里处理?

转载 作者:行者123 更新时间:2023-12-02 14:56:16 25 4
gpt4 key购买 nike

我正在内部争论应该在哪里处理数据更改检查,但无法决定最有意义的做法:

  1. 在 GUI 中处理 IsChanged - 这需要在页面加载和数据发布之间保留数据,这可能会产生大量带宽/页面传输开销。这在 win 表单应用程序中还算不错,但在网站中,这可能会对带宽成本产生重大财务影响。
  2. 在 DAL 中处理它 - 这需要多次调用数据库以检查在保存数据之前是否有任何数据已更改。这可能意味着对数据库进行额外的不必要的调用,可能会因不必要的数据库查询而导致可扩展性问题。
  3. 在 Save() 存储过程中处理它 - 这可能需要存储过程对表进行额外的不必要的调用来进行检查,但会保存从 DAL 到数据库的额外调用。这可能比让 DAL 处理它更好地扩展,但我的直觉告诉我这可以做得更好。
  4. 在触发器中处理它 - 这需要使用触发器(我在情感上反对这样做,除非绝对必要,否则我倾向于避免触发器)。
  5. 根本不处理 IsChanged 功能 - 不仅处理“LastUpdated”日期变得困难,而且将不必要的数据保存到数据库本身对于可扩展性来说似乎是一种不好的做法。

因此,每种方法都有其缺点,我不知道哪种方法是最好的。有没有人有任何更具可扩展性的想法来处理数据持久性,以查看是否有任何变化的特定目的?

架构:SQL Server 2005、ASP.NET MVC、IIS7、针对非特定全局受众的高可扩展性要求。

最佳答案

好吧,这是另一个解决方案 - 我没有考虑所有的影响,但我认为它可以工作:

考虑一下 GetHashCode() 比较功能:

在页面加载时,您可以计算页面数据的哈希码。如果您愿意,可以将哈希码存储在页面数据或 View 状态/ session 中。

在数据发布(回发)时,您计算发布的数据的哈希代码并将其与原始哈希进行比较。如果不同,则用户更改了某些内容,您可以将其保存回数据库。

  • 优点
    • 您不必在页面加载时存储所有原始数据,从而减少带宽/页面传输开销。
    • 您不必让 DAL 对数据库进行多次调用来确定某些内容是否发生更改。
    • 仅当某些内容发生更改时,记录才会在数据库中更新,从而保持正确的上次更新日期。
  • 缺点
    • 您仍然需要将数据库中未存储的任何原始数据加载到业务对象中,而“ View 状态”是将有效记录保存到数据库所必需的。
    • 改变一个字段就会改变哈希值,但你不知道是哪个字段,除非你调用数据库中的原始数据进行比较。顺便说一句,也许您不需要。如果您必须更新任何字段,时间戳会发生变化,并且覆盖未更改的字段不会产生任何影响。
    • 您不能完全排除发生碰撞的可能性,但这种情况很少见。这归结为碰撞的后果是否可以接受?
  • 要么/要么
    • 如果您将哈希存储在 session 中,则可以节省带宽,但会增加服务器资源,因此在任何一种情况下都需要考虑潜在的可扩展性问题。
  • 未知数
    • 更新单个列的开销与更新记录中的多个/所有列的开销是否不同?我不知道性能开销是多少。

关于asp.net - IsChanged 功能应该在哪里处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1555148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com