Database-Design

客戶端上的單獨表或列舉?

  • December 30, 2019

我有幾個表,其中許多表中有“status”、“measure_unit”等列。

有 2 種方法可以處理“狀態”等列。

  1. 在數據庫中創建單獨的表“statuses”、“measure_units”,並通過外鍵從主表中引用它們。通過字元串/slug 或通過 id。也就是說,這些“statuses”、“measure_units”表是最多有10條記錄的表,它們很少被修改。
  2. 在客戶端應用程序的一側而不是數據庫中的表上創建列舉/結構“statuses”、“measure_units” 。客戶必須確保完整性。

他們都有自己的優點和缺點。

在不同的方法中,哪種方法更多更好?

無論您如何切片,都必須在查詢中對“狀態”的名稱進行硬編碼,例如:

select * from articles where status = 'active'

這使得#1 和#2 之間的差異更小。

我很高興維護一個使用列舉的單人應用程序,我可以說,作為一個年輕的 DBA,這是一場噩夢。我不得不聯繫應用程序開發人員十幾次,以獲取他的列舉值來建構我自己的查找表。最好的部分是當客戶想要其中一個附加選項時,他只是將新值插入到列表中(有什麼壞處?)。結果是狀態表中的 ALL 7 過去表示該文件正在由主管審核,但現在它們都標記為已取消。這對數據驗證人員來說是個奇蹟。

我的觀點是,對於我和我的工作來說,數據庫中的所有值都應該在數據庫中。如果需要,請使用列舉,但將所有內容儲存在查找表中並具有關係約束。除了我的數據庫系統,我不相信任何東西來維護數據完整性,無論是 Oracle、SQL Server、MySQL 等等。

我一直更喜歡可移植性而不是“技巧”。雖然現在大多數 RDBMS 確實支持列舉,但情況並非總是如此。至於加入這些“狀態”表的成本,通常 RDBMS 優化器足夠智能,可以將它們保存在記憶體中,因為它們“總是”被訪問,因此性能在這裡不是問題。

引用自:https://dba.stackexchange.com/questions/256449