应该有一个管理面板的子系统,不同的用户可以管理他们的产品,但在影响主产品表之前,每个更改都应该得到管理员的批准。有三个主表:
- 产品:存储最终批准并在整个系统中使用的产品
Changes_versions :与 Product Table 具有一对多关系的表,表示每个更改版本由谁提交,何时提交,并由管理员批准/拒绝或仍处于 Pending 状态。表结构如下:
CREATE TABLE `changes_versions` ( `xid` int(11) unsigned NOT NULL AUTO_INCREMENT, `xcreated_date` datetime DEFAULT NULL, `xupdated_date` timestamp NULL DEFAULT NULL, `xversion` int(11) DEFAULT NULL, `xobject_id` int(11) DEFAULT NULL, `xobject_type` varchar(255) DEFAULT NULL, `xstate` enum('PENDING','ACCEPTED','REJECTED') DEFAULT 'PENDING', PRIMARY KEY (`xid`) ) ENGINE=InnoDB AUTO_INCREMENT=165 DEFAULT CHARSET=utf8
更改:与 Changes_versions 表具有一对多关系的表,该表保留主表的每一列更改记录(这里我指的是产品表),并且通过管理员批准 change_version 记录,其相关更改记录将放置在主表列中。表结构如下:
CREATE TABLE `changes` ( `xid` int(11) unsigned NOT NULL AUTO_INCREMENT, `xcreated_date` datetime DEFAULT NULL, `xcreated_by` varchar(255) DEFAULT NULL, `xupdated_date` timestamp NULL DEFAULT NULL, `xupdated_by` varchar(255) DEFAULT NULL, `xversion_id` int(11) DEFAULT NULL, `xcolumn_name` varchar(255) DEFAULT NULL, `xcolumn_value` varchar(255) DEFAULT NULL, `xstate` enum('PENDING','ACCEPTED','REJECTED') DEFAULT 'PENDING', `xadmin_review` text, PRIMARY KEY (`xid`) ) ENGINE=InnoDB AUTO_INCREMENT=764 DEFAULT CHARSET=utf8
使用这个系统和表模式,我处理了记录更改,用户获取记录列表,如果用户有任何 Pending 状态 change_version,系统将提取其相关更改记录并将它们放在获取的产品行的右列中(临时只是用于显示),因此即使用户有任何未决状态更改,他/她也可以在他/她的面板中看到其更改(不是主系统,只有他/她的面板)。
问题在于插入新记录,我可以创建一个 change_version 记录并将所有用户数据保存到指向新 change_vesrion 记录的更改表中,但 change_vesrion 记录未连接到任何产品记录,因为没有记录。
请注意,基于系统复杂性和当前稳定性,我不想在产品表中添加任何列来表明这是一个临时记录。
所以我想要一个策略来处理问题,比如当我在用户面板中对产品进行分页并用最后的 PENDING 更改填充它们时,没有插入记录的产品记录来填充更改,因此用户无法看到他/她以前插入的产品。
我还应该注意到,对于这个问题,这个表结构可能看起来很复杂。这个结构很复杂,因为 changes_vesrsion 和 changes 表保存并显示了许多具有不同结构的表的历史和管理员批准过程。