【问题标题】:Best Practice Updating DB Records更新数据库记录的最佳实践
【发布时间】:2010-10-11 20:33:38
【问题描述】:

假设您检索了 100 条记录,并将它们显示在一个页面上。用户仅更新页面上的 2 条记录。现在您只想更新两条记录,而不是其他 98 条记录。

最好在页面上提交一个,然后以某种方式知道哪两个已更新,然后仅将这两个发送到数据库进行更新?

“不知何故”是什么样子的?

或者,您是否会为每一行设置一个更新提交按钮,并让它只更新与其关联的记录?

【问题讨论】:

  • 忘了添加,还假设您使用的是 Hibernate,请回答问题(也许 Hibernate 会自动执行此操作?)

标签: java database hibernate sql-update


【解决方案1】:

一个提交按钮。我可以预见我可能会使用不止一个,但在一般情况下只使用一个。 (注意,对我来说,这看起来像是一个网页问题,所以我用这个假设来回答。)

您可以想到 3 种方法来处理跟踪更改:

JavaScript:在更新隐藏字段的控件上放置一个 onChange() 函数。如果该隐藏有一个值,则更新关联的记录。需要浏览器上的JS,不会告诉你更新哪些字段,只告诉你哪些记录。

大量表单字段:每个控件都放置一个隐藏字段,并在它们返回时进行比较。这会很难看,但它可以让您知道要更新哪些字段(不仅仅是记录)。它还可以让您知道是否有人撤消了开始的更改。

会话:您可以将原始值放在会话变量中,然后在值返回时进行比较。这将比许多隐藏字段更优雅一些,并且对玩回传数据的人不那么开放(因为你永远不应该相信任何返回的东西,即使是在隐藏字段中)。需要浏览器上的 cookie 和服务器技术上的会话。

【讨论】:

    【解决方案2】:

    使用 jQuery 或其他一些 JavaScript 库对其进行 Ajax,并在每一行上放置和更新按钮。

    【讨论】:

      【解决方案3】:

      这个问题有很多答案,在某种程度上它们取决于您的开发工具和网站的“感觉”。

      如果您正在实现 Ajax 调用以逐行进行更新,那么从逻辑上讲,每行都有一个按钮,然后在更改行时使用 Ajax 调用更新它。

      这也是断开数据集旨在解决的场景,ADO.net 可以很好地处理这些问题。

      与以往一样,答案是“视情况而定!”

      【讨论】:

        【解决方案4】:

        当用户更改输入字段时,您可以使用 JavaScript 将每个字段标记为已更改。创建一个隐藏字段,其中包含您要更新的行的 id 和脏标志。 (如 is_dirty_$id) 在 JavaScript 中,创建一个 onChange 处理程序,将隐藏字段设置为脏。当任何输入发生变化时。

        或者,您可以为您显示的每个真实字段创建隐藏字段。隐藏字段将包含初始值。检查服务器端的每个字段以确定发生了什么变化。

        您可能希望将 last_modified 日期存储为每条记录的隐藏字段。这样,如果另一个用户更新了相同的记录,您可以显示一条错误消息,指出“此记录已被另一个用户更新”或类似的信息。

        【讨论】:

          【解决方案5】:

          当然,您可以通过不同的方式来做到这一点。通常,您可以通过使用 Javascript 仅针对已更改的记录组装您的 POST 数据来节省一些麻烦和服务器端处理。关于这可能如何工作的两个想法:

          1) 走 ajax 路线并进行 live-editing。因此记录显示在表格中,并且似乎不可编辑。当用户单击特定行时,该行变得可编辑,方法是使用 Javascript 动态创建适当的 html 表单。然后有一个提交按钮或其他一些处理程序(例如,将焦点移动到另一个表行),这将触发更新数据库的 POST(通过您首选的 ajax 方法异步)。令人高兴的是,主流 Javascript 框架可以在这方面提供很多帮助。

          2) 复选框 - 每当编辑一行时,它的复选框就会被选中。单击提交按钮时,使用 javascript 通过抓取选中复选框的行中的所有内容来发布 POST 数据。用户可以在提交之前取消选中复选框以取消对该行的更改。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-08
            • 2019-08-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多