背景:最近在做一個Java Web項目,SSH框架,MySQL數據庫。項目的數據庫沒有設備用字段。在開發過程中,因數據庫設計者未考慮周到,業務實體有一個屬性沒有對應的字段,因此需要在數據庫表加一個字段。又由于此字段要求不可為空,并且在開發階段,測試數據不多。于是我在drop掉了原來的表,增加了一個字段再重新建了一張表。按照通常的做法,設計數據庫都會在后面加幾個類型為varchar的預留字段,也沒有具體思考過為什么要這么做,這么做的好處是什么。在遇到這個問題之后引起我思考:預留字段這個通用的做法是否能減少開發階段由于考慮不周到,或后續維護階段因為需求變更或者擴展改造而需要增加字段而造成的麻煩。就此與同事進行了討論,大家意見不一,以下是正反方的一些意見和看法。希望大家能根據以往的項目經驗和設計原則給出一些解答,怎樣的設計能確保數據庫健壯,可擴展。反方觀點:不需要原因:數據庫設置備用字段無法在字段名上體現其意義,不規范,后期維護麻煩。在需要增加字段的時候如果直接add column,也不會有太大工作,但能保證數據庫字段的規范。雖然在啟用備用字段的時候可以文檔說明,但在POJO上對應其屬性為attribute1,attribute2等,代碼的可讀性不強。而且,預留字段全部統一varchar,也不太合適。另外有人說加了預留字段會影響性能(這點已經確定不會影響性能,因為其實預留字段未啟用前在數據庫里面都是一個null值)。我的觀點:需要原因:持久層的設計,數據庫表結構不應輕易變更。因此應設置備用字段。啟用備用字段后,只修改代碼,在代碼中增加注釋和并文檔說明即可,不需要改動數據庫結構,更方便。我對反方的反駁:就這個問題我咨詢了一個做DBA的朋友,據他所說:如果沒有備用字段,如果后期要加字段,用add column的方法會改變原先的數據庫存儲結構,造成數據移動,移動需要時間,而且會移動到其他數據塊。(很專業的數據庫知識,不是很懂)總之意思是add column會影響數據庫性能,造成一些不可預知的錯誤。一個疑問:假如項目已經在實施階段,數據庫里存儲的已經是一些生產數據,不可輕易刪除,但需要加的字段是不可為空的字段,在有備用字段和沒有備用字段這兩種情況下,分別應該怎么處理那些前期已有的數據。
2 回答

qq_花開花謝_0
TA貢獻1835條經驗 獲得超7個贊
建議添加,對于反方提到的問題,只要代碼和文檔規范是可以避免這樣的問題的,即使遇到這樣的問題,也比修改表名帶來的危險要小,除了要修改代碼、存儲過程、配置文件中的表名,還要考慮數據的遷移等問題,如此多的改動難免會出現這樣那樣的問題,因此保證系統的穩定性來看,攜帶幾個擴展字段為了后續使用也無妨。

滄海一幻覺
TA貢獻1824條經驗 獲得超5個贊
當需要增加相關的信息的時候,就要具體情況具體分析:
如果數量很少,而且信息的性質與原表密切相關,那么就可以直接在原表上增加字段,并將相關的數據更新進去;
如果數量較大,或者并非是原表對象至關重要的屬性,那么就可以新增一個表,然后通過鍵值連接起來;
對于表的數據的存儲位置所導致的性能問題,我們可以通過在特定時間對數據庫的數據進行重組來解決,而這項工作對于長期運行的數據庫來說,也是需要定期進行的。
添加回答
舉報
0/150
提交
取消