2014-04-04 62 views
2

我有一個非常舊的應用程序,它使用需要更新的SQL數據庫。我還想借此機會改進數據庫結構,我希望能提供一些建議。用戶可以在其中創建數據類型的數據庫

基本問題是數據庫的一個重要部分必須是用戶可配置的,而無需觸摸代碼。更具體地說,DB存儲產品,並且這些產品根據類型具有不同的規格(即列)。該應用程序必須能夠搜索任何列。只有幾種類型(〜20),但管理員必須能夠創建一個新的,而不需要觸摸代碼。 需要爲每個產品存儲的數據是字符串或浮點數,每種類型不能超過7個。

而不是創建一個接口來創建和刪除表,實現了以下「解決方案」。 - 在產品表中,id有一列; ProducTypeID的一列; 7個字符串列和7個浮動列 - 在ProducType列中,有一個ProducTypeID列,14個字符串列指示每個產品類型的7個字符串列和7個浮動列的名稱。如果一個產品不需要那麼多的列,那麼列名是NULL

這可以工作,但是由於額外的間接性對維護客戶端代碼非常惱人。

現在的問題是:我應該留在一個SQL數據庫,並添加一種方式來創建/刪除表,或者我應該使用一個noSQL數據庫?每種情況下的優點和缺點是什麼?

+0

並非所有的NoSQL數據庫都是無模式的。 – Philipp

+0

@Philipp:你偏離正軌。感謝您的澄清。 – Hernan

回答

1

請記住,在SQL數據庫中,在大型表上添加和刪除列可能是一項非常昂貴的操作,可能需要幾分鐘甚至幾小時。在飛行中這是一個非常糟糕的主意。將一堆「多用途」列添加到表中並不會好得多。這很難查詢,並且您對產品可以擁有多少屬性有限制。

當每個產品具有0-n個動態屬性時,通常的書本解決方案是創建第二個表ProductID(primary key) | PropertyName(primary key) | PropertyValue。這允許每個產品具有任何數量的屬性。你可以很容易地JOIN它與主要產品表,以獲得所有產品的屬性。

當您開放切換數據庫技術時,您還可以使用面向文檔的NoSQL數據庫,該數據庫不使用像MongoDB或CouchDB這樣的固定模式。在這樣的數據庫中,集合中的每個文檔都可以有不同的字段集合。但是在決定進行這一步之前,請評估這樣的數據庫如何影響應用程序的其他部分。清單的一切可能受到積極或消極的影響,不知道你的整個應用程序內外都將是一個太寬泛的問題。

+0

在這個「通過書」的解決方案中,你如何處理多種數據類型。我是否需要爲FloatProperties和StringProperties創建一個表? – Hernan

+1

@Hernan這將是一個選項。另一種選擇是創建一個具有兩個不同類型的屬性列的表。 – Philipp

相關問題