在PHP/MySQL CMS中实现订单&;处理并发性

在PHP/MySQL CMS中实现订单&;处理并发性,php,mysql,database-design,concurrency,rdbms,Php,Mysql,Database Design,Concurrency,Rdbms,我有以下表格: ======================= ======================= | galleries | | images | |---------------------| |---------------------| | PK | gallery_id |<--\ | PK | image_id | | |

我有以下表格:

=======================           =======================
| galleries           |           | images              |
|---------------------|           |---------------------|
| PK | gallery_id     |<--\       | PK | image_id       |
|    | name           |    \      |    | title          |
|    | description    |     \     |    | description    |
|    | max_images     |      \    |    | filename       |
=======================       \-->| FK | gallery_id     |
                                  =======================
=================================================================
|画廊| |图片|
|---------------------|           |---------------------|
|PK |画廊id | FK |画廊id|
=======================
我需要实现一种方法,将与库关联的图像按特定顺序进行排序。据我所知,关系数据库并不是为分层排序而设计的

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

我不确定最好的方法是什么,因为我从来没有在数据库中实现过排序,而且我对并发性还不熟悉。因此,我读过关于锁定MySQL表的内容,不确定是否应该在这种情况下实现它

以下是我的两个想法:

  • 将名为
    order\u num
    的列添加到
    images
    表中。锁定表并允许客户端重新排列图像的顺序,然后更新表并将其解锁

  • 将名为
    order_num
    的列添加到
    images
    表中(与上面的想法1相同)。允许客户端在不锁定的情况下一次更新一个映像的位置

  • 谢谢

    如果您不想“按用户排序”,那么
    order\u num
    列似乎是正确的选择。
    如果您选择InnoDB作为存储子系统,您可以使用事务,而不必锁定表。

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

    在基于web的世界中,您不希望锁定表以便用户进行编辑,然后等待编辑完成后再解锁表。在这种情况下,用户1可能永远不会回来,他们可能会丢失会话,或者他们的浏览器可能会崩溃,等等。这意味着您必须做大量的工作来确定何时解锁该表,以及让用户2知道该表已锁定的代码,而他们对此无能为力

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

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

    这个问题的后遗症是,无论谁得到他们的订单被覆盖,都必须再次这样做。恼人但没有损失,实现这一点的代码比处理锁定的代码要简单得多


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

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

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