在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开始编辑后版本已更改,请阻止保存,并提供重新加载编辑。每次成功编辑后增加版本