我們目前正在開發一個Web應用程序,其中一項功能是由用戶創建事件。這些事件可以稍後由用戶或管理員刪除。但是,客戶端要求事件並非真正從數據庫中刪除,而只是標記爲已刪除。用戶只能看到未刪除的事件,但管理員應該也可以通過刪除的瀏覽器進行瀏覽。這就是所有功能。在數據庫中設計檔案。一些模式可能?
現在我建議我們應該簡單地增加一個名爲「狀態」額外的列,這將有幾個有效值:ACTIVE和刪除。通過這種方式,我們可以區分正常(活動)和已刪除事件,並創建真正簡單的查詢(SELECT * FROM EVENTS WHERE STATUS ='ACTIVE')。 但是我的同事不同意。他指出,不管現在活動事件和已刪除事件在將來的需求中是否共享相同的信息(因此它們可以存儲在同一個表中),我的更改和客戶端例如需要存儲一些關於已刪除事件的附加信息(比如刪除日期,刪除它,爲什麼他這麼做 - 有點評論)。他表示,爲了在將來滿足這些要求,我們必須在EVENTS表中添加額外的列,這些列將保存特定於已刪除事件的數據,而不是針對活動事件。他提出了一個解決方案,在該解決方案中創建具有與EVENTS表相同模式的附加表(如DELETED_EVENTS)。每個已刪除的事件都將從EVENTS表中物理刪除並移至DELETED_EVENTS表。
我強烈他的想法不同意。它不僅會使SQL查詢更復雜,效率更低,而且這完全是針對YAGNI的。我也不同意他的觀點,即如果未來需求發生變化,我的想法會使我們在EVENTS表中創建更多(不可爲空)的列。在我的場景中,我會簡單地創建像DELETED_EVENTS_DATA這樣的新表(它將保存這些額外的存檔數據),並在EVENTS表中添加引用鍵以維護EVETNS和DELETED_EVENTS_DATA表之間的一對一關係。
不過我被一個事實,即兩個開發誰在軟件和數據庫設計通常有着相似的看法可能有關於如何要求應該在數據庫級別被設計成完全不同的意見掙扎。我認爲我們可能都走錯了方向,還有另一個(第三個)解決方案?還是有更多的只是一個選擇? 你如何設計這種要求?有沒有適當的方式或指導方針?任何幫助將十分讚賞
您可能會考慮將其標記爲社區維基 - 我不確定您會找到可證實的正確答案。 – Mayo 2010-01-20 22:45:14
這是一個很好的問題,我期待看到一些顯示的答案。複製到DELETED_EVENT表格時從表格中刪除行可能會導致一些問題,如果有任何對您的EVENTS表的引用需要保留以用於歷史目的。你最終會得到懸掛的外鍵,或者你可能必須加入兩個表的外鍵。聽起來不漂亮。 – rayd09 2010-01-20 22:49:40
爲什麼我的回答被解除了答案? – anthonyv 2010-01-21 20:55:39