我已經接管了具有超過30列的用戶表的項目的開發。不好的一面在於列的更改和添加不斷髮生。有多少個數據庫表列太多?
這是不對的。
我是否應該將額外的字段作爲值移動到第二個表中,並創建存儲這些列名的第三個表?
user
id
email
user_field
id
name
user_value
id
user_field_id
user_id
value
我已經接管了具有超過30列的用戶表的項目的開發。不好的一面在於列的更改和添加不斷髮生。有多少個數據庫表列太多?
這是不對的。
我是否應該將額外的字段作爲值移動到第二個表中,並創建存儲這些列名的第三個表?
user
id
email
user_field
id
name
user_value
id
user_field_id
user_id
value
這真的取決於你想做什麼。
很難說有多少是太多。這真的很主觀。我認爲你應該問的問題不是「是否有太多的專欄?」,而是「這些專欄是否屬於這裏?」我的意思是,如果用戶表中有列不一定是用戶的屬性,那麼它們可能不屬於。例如,如果你有一堆總結用戶地址的列,那麼你可能會將這些地址列表放入一個帶有FK的地址表中。
如果可能的話,我會避免使用鍵/值表。它可能看起來像一個簡單的方法來使事物可擴展,但從長遠來看這真的只是一個痛苦。如果您發現模式的變化非常一致,您可能需要考慮設置某種變更控制,以僅對必要變更進行審覈,或者遷移到另一種更好地支持無模式存儲的技術,如使用MongoDB的NoSQL或CouchDB的。
我懷疑是否在此應用程序大部分的東西是必要的。但是,再次,我只是一個僱傭的程序員。 – Xeoncross 2010-12-16 20:03:56
這通常被稱爲EAV,以及這是否是適合你的數據庫取決於很多因素:
http://en.wikipedia.org/wiki/Entity-attribute-value_model
http://karwin.blogspot.com/2009/05/eav-fail.html
http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back
列過多是不真的是其中之一。
如果表格中的更改和添加並不是一件壞事,它意味着它們能準確反映業務需求的變化。
如果變化和附加是連續的,那麼也許你需要坐下來做更好的定義需求。現在我不能說30列是否會出現問題,因爲它取決於它們的寬度以及是否應該將其移到相關表格中。一旦如果你有像phone1,phone2,phone 3這樣的字段,你就有一團亂麻,需要將其分解到user_phone的相關表中。或者,如果所有列都很寬(並且您的整個表格寬度比數據庫存儲數據的頁面寬),而且有些不是查詢常用的那些列,那麼在相關的表中可能會更好一些,一個關係。我可能不會這樣做,除非你有實際的性能問題。
然而,所有可能的選擇,您所描述的EAV模型是從maintainabilty和性能的角度來看,最糟糕的一個或兩個。對這個模型寫出體面的查詢是非常困難的。
一句話,NO! – HLGEM 2010-12-17 22:30:05