2017-05-29 96 views
2

應該有一個管理面板的子系統,不同的用戶可以管理他們的產品,但每個變更在影響主要產品表之前都應該被管理員批准。 有三個主要的表:建立管理審批系統的最佳實踐

  1. 產品:具有最終批准,並在整個系統
  2. Changes_versions是用來儲存產品:帶一張表要與產品表一對多的關係,表示每一個變化版本承諾通過誰,什麼時候,並已被批准/由管理員拒絕或仍處於待定狀態。表結構如下:

    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 
    
  3. 的變化:一個表,其中有一到與Changes_versions表中的許多關係,即保持每一次合作lumn更改主表(這裏我是指產品表)的記錄,並通過管理員批准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 
    

與本系統和表模式我處理與記錄的更改工作,用戶獲取的記錄列表中,如果用戶有任何待定狀態change_version,系統將拉動其相關變化記錄並將它們放置在提取的產品行中的右列(臨時僅用於顯示),因此即使用戶有任何掛起的狀態更改,他/她也可以在他/他的面板中看到其更改(不是主系統,只有他/她面板)。

問題是插入新記錄,我可以創建一個change_version記錄並將所有用戶數據保存到更改表指向新的change_vesrion記錄,但change_vesrsion記錄沒有連接到任何產品記錄,因爲沒有記錄。

請注意,根據系統複雜性和當前穩定性,我不想將任何列添加到產品表中以表明這是臨時記錄。

因此,我想要一個策略來處理問題,例如我在用戶面板中分頁產品並填寫最後一個PENDING更改時,沒有插入記錄的產品記錄以填充更改,因此用戶無法看到他/她以前插入的產品。


我也應該注意到,一些本該是什麼結構的表可能看起來複雜question.this結構是複雜的,因爲changes_vesrsion和chaneges表保存和不同結構的許多表當前的歷史和管理審批流程。

+0

擁有Product和ProductVersion不是更簡單,其中Version表包含Product中的所有列加上授權列。這意味着通過將主要字段從版本表複製到產品來完成更改。對於新記錄,Version.productID將爲NULL,但可以在創建產品記錄後填寫。 –

+1

@NigelRen好吧,我應該解釋說,這個版本控制系統的使用不僅僅是產品表。它具有不同結構和列的多個表的使用方式,因此您的方式不適用於我的情況 –

+0

應該是否可以更改不在原始表(產品)中的新項目(產品),因爲它從未被接受過? –

回答

2

讓我先用我的話來描述你的問題(糾正我,如果我錯了)。

您的系統中有不同的項目(如產品),每個項目類型有一個(InnoDB)表。 每個項目表都有一個AUTO_INCREMENT列(如id)。 您有一個項目版本表(changes_versions)來存儲特定項目的不同版本。 該項目是通過它引用的表

  • xobject_id這是一種「多態外鍵」引用的PK表中的上述
    • xobject_type(如「產品」)來識別問題:用戶創建新項目時,不應將其插入到項目表 中,但您需要參考以存儲xobject_id列。

      一個可能的解決方案:通過在事務中插入和刪除一行來「保留」該ID。

      例子:

      start transaction; 
      insert into products(column_1, column_2) values ('value_1', 'value_2'); 
      delete from products where id = last_insert_id(); 
      select last_insert_id(); 
      commit; 
      

      你會得到什麼:因爲它是在同一個事務中刪除

      • ,插入的行永遠不會成爲其他用戶不可見。
      • last_insert_id()仍然會從已刪除的行中返回自動生成的ID;
      • 該ID將被「燒」,所以引擎將永遠不會再生成它。
      • 當管理員接受該項目時,您仍然可以手動插入該ID。
      • 不需要更改數據庫模式。

      演示:http://rextester.com/IJB42705

    +0

    感謝您回答我的問題。我的問題是,當我向用戶展示他們的產品時,我爲更改表獲取更改,並在模型級別中用實際產品數據替換它們。即使用戶有任何未經批准的更改,他/她仍可以看到它的面板上的變化。但因爲我的查詢是從產品表(加入其他幾個表),我不知道如何處理沒有任何實際產品的變化。 –

    +1

    @ArefAnafgeh您將需要改變任何方式。這樣你可以保留你的模式,但需要重寫一些代碼。您需要從'changes'表中取消未接受的項目。或者您更改要求並在單獨的視圖中列出這些項目。我寫了這個答案,因爲你顯然不想更改原始表。但是我可能會將「accepted」或「status」列添加到項目表中。 –

    1

    我認爲SQL View可以在這裏得心應手,更改您的表名並添加一個標記字段,該字段標記臨時行,然後創建一個名稱爲Product的視圖,並排除此字段以及該字段標記的行查看,通過這種方式,您的原始表格(現在轉換爲視圖)將保持未觸摸

    +0

    謝謝replying.this也是一個好方法,但視圖在連接和複雜查詢中的表與表的性能相同嗎? –

    2

    對此的解決方案是創建所有表作爲discribed,當用戶創建一個產品進入changes_version表應該有一個MySQL事件product表和匹配定期檢查每一條記錄它與changes_version表。如果在changed_version表中找到任何更改或新插入,則應相應插入/更新product表。

    修訂方案:

    您可以通過當用戶登錄,並刪除它退出從changes_version插入用戶記錄到產品表實現它。這適用於那些尚未搬入product表的產品,您可以通過查詢進行檢查。

    如果您有前端來源,那麼您只能向用戶顯示changes_version記錄,並在獲得批准後通過觸發器將其移至product表。

    +0

    以及問題是我不想插入這樣的記錄到產品表中,因爲它在project.i的其他部分中創建了複雜性,我在chages_version表中區分插入的記錄和更新的記錄,但是當我想要顯示使這些更改數據,我顯示原始數據(從產品)與他們的變化合並在一起。但我不知道如何做到這一點與插入記錄。因爲合併我的系統尋找產品記錄和插入情況沒有產品record.i希望我能清除我的需求 –

    +0

    你能告訴我產品表模式嗎? –

    +0

    以及其巨大的表架構。您要查找的具體信息?表有兩個狀態列,1.xactive是具有活動/非活動狀態的枚舉。2.xdeleted是枚舉數據:已刪除/未刪除。其他欄只是關於產品的信息。你需要的是哪種數據? –