【问题标题】:Implementing order in a PHP/MySQL CMS & dealing with concurrency在 PHP/MySQL CMS 中实现订单并处理并发
【发布时间】:2010-06-23 05:43:23
【问题描述】:

我有以下表格:

=======================           =======================
| galleries           |           | images              |
|---------------------|           |---------------------|
| PK | gallery_id     |<--\       | PK | image_id       |
|    | name           |    \      |    | title          |
|    | description    |     \     |    | description    |
|    | max_images     |      \    |    | filename       |
=======================       \-->| FK | gallery_id     |
                                  =======================

我需要实现一种将与图库关联的图像按特定顺序排序的方法。据我了解,关系数据库不是为分层排序而设计的。

我也希望为并发的可能性做好准备,尽管它极不可能在我当前的项目中成为问题,因为它是一个单用户应用程序。 (所以,这里的优先级是处理允许用户重新排列顺序)。

我不确定解决此问题的最佳方法,因为我从未在数据库中实现排序,并且对并发不熟悉。因此,我已经阅读了有关锁定 MySQL 表的信息,但不确定这是否是我应该实施它的情况。

这是我的两个想法:

  1. 将名为 order_num 的列添加到 images 表中。锁定表格并允许客户端重新排列图像的顺序,然后更新表格并解锁。

  2. images 表中添加一个名为order_num 的列(就像上面的想法1)。允许客户端一次更新一个图像的位置而不锁定。

谢谢!

【问题讨论】:

    标签: php mysql database-design concurrency rdbms


    【解决方案1】:

    这是我的想法:您不希望在不太可能发生的问题上投入太多工时。因此,采取一个不会引起很多副作用的简单解决方案,如果出现问题,请稍后解决。

    在基于网络的世界中,您不希望锁定表格以供用户进行编辑,然后等到他们完成后解锁表格。在这种情况下,用户 1 可能永远不会回来,他们可能会丢失会话,或者他们的浏览器可能会崩溃等。这意味着您必须做很多工作来确定何时解锁表,以及让用户 2 知道的代码桌子被锁定了,他们不能用它做任何事情。

    我建议改用这种设计:让他们都进入编辑模式,可能在他们的浏览器中,使用一些 javascript。他们可以按顺序拖动图像,直到他们满意,然后他们才完整提交订单。您在单个事务中将 order_num 字段更新到数据库。

    在这种情况下发生的最糟糕的事情是用户 1 和用户 2 同时在编辑,最后编辑的人是保留顺序的人。也许它们会同时更新,但数据库会处理它,因为它将对事务进行排队。

    这个问题的回退是,无论谁的订单被覆盖,都必须再次这样做。烦人但没有损失,实现这一点的代码比处理锁定的代码简单得多

    我不想回避你的问题,但这是我的想法。

    【讨论】:

      【解决方案2】:

      如果您不想“按用户排序”,order_num 列似乎是正确的选择。 如果您为存储子系统选择 InnoDB,您可以使用事务并且不必锁定表。

      【讨论】:

        【解决方案3】:

        关系数据库和层次结构: 我使用 id (自动增量)和父列来实现层次结构。零的父元素始终是根元素。您可以按 id 订购,父母。

        并发: 这是处理并发的一种简单方法。使用版本列。如果自用户 1 开始编辑后版本已更改,请阻止保存,提供重新加载编辑。每次成功编辑后增加版本。

        【讨论】:

          猜你喜欢
          • 2018-11-22
          • 1970-01-01
          • 2013-05-24
          • 1970-01-01
          • 1970-01-01
          • 2015-05-12
          • 2023-04-03
          • 2011-03-20
          • 1970-01-01
          相关资源
          最近更新 更多