2014-02-11 186 views
0

我正在研究一個基於雲的解決方案,它將使人們能夠輸入存儲在SQL數據庫中的信息。XML與關係數據庫

我的應用程序的好處是人們還可以更改存儲哪種類型的信息(即管理員可以添加/刪除某些屬性來更改人們可以存儲的數據)。

在關係型數據庫中這樣做確實有效,但它意味着管理員將會改變數據庫的實際結構,這樣有很多風險和問題,我真的不想走這條路。

我曾想過使用XML,所以一個表包含例如兩個表:

模板數據 列(ID,XML) - 這將包含的是什麼人將進入「默認模板/結構」,這當用戶輸入數據並提交

數據表 列(ID,XML)將使用 - 這將包含使用我的第一列的XML模板的實際數據,但實際的數據存儲在它

不這聽起來像它會起作用,我可能擊中潛在的PE性能問題?很多數據都是可搜索的,並可能在數據庫中有很多記錄。 - 我想我可以考慮將可搜索的數據存儲在管理員無法修改的單獨字段中。

感謝

+0

如果你正確地設計你的關係數據庫,所有的管理員將不得不做的是寫入數據。 –

+0

是的,但應用程序的好處是可以「更改」存儲的數據。因此,例如,可能有一個包含Customers的表,他們可能還想要捕獲數據庫中不存在的內容。所以他們需要爲它添加一個屬性。管理員需要能夠改變這個 – realtek

+0

的結構有時你被這樣的東西卡住了 - 也在那裏。當它是一個財產不良或文件存儲,並且對進入的數據的控制有限時,您可以「正確設計」的東西並不多。存在邊緣案例。我更喜歡漂亮的表格結構,但有些情況下XML數據類型是有意義的。 – TomTom

回答

1

這是可能的,如果你做一點智能這是可行的。

與Justings wroong回答相反,你並沒有陷入字符串操作和搜索......如果你真的關心閱讀文檔。

很久以前,SQL Server增加了一個XML字段類型。

這需要XML(僅)並在內部對其進行分解並具有索引機制(詳情請參閱cech http://technet.microsoft.com/en-us/library/ms191497.aspx)。

查詢則是這樣的:

SELECT 
    EventID, EventTime, 
    AnnouncementValue = t1.EventXML.value('(/Event/Announcement/Value)[1]', 'decimal(10,2)'), 
    AnnouncementDate = t1.EventXML.value('(/Event/Announcement/Date)[1]', 'date') 
FROM 
    dbo.T1 
WHERE 
    t1.EventXML.exist('/Event/Indicator/Name[text() = "GDP"]') = 1 

(從How to query xml column in tsql複製)

多遠它可以讓你依賴 - 這是數據庫重,可能有侷限性,但它是相距甚遠存儲字符串和說再見的任何索引的替代方案。

實際上,您甚至可以添加xml模式,以便數據必須符合某些特定模式。

+0

優秀的答案TomTom,我會閱讀並查看文檔和示例。萬分感謝 – realtek

+0

@realtek請注意,這些服務器上的密集型服務器密集型服務器。儘量避免它 - 無法替代「真正的表」。但是,如果你需要存儲「任意數據」或「文件」,男人,他們會搖擺;)正如你在你的案例中所說......有時候這是需要的。 – TomTom

-1

這是可能的,但數據檢索將受到影響,如果你將查詢基於XML字符串中的值的數據。如果你將使用這個,你就會陷入使用一個LIKE過濾器,這個過濾器不建議用於搜索行數太多的表格。如果您總是使用ID列讀取數據,我認爲這會很好。另一方面,如果您將XML中的數據分成幾列,則可以改進基於多列查詢數據的方式。這會加快你的搜索,特別是如果列索引。

+0

是的我同意,我想我可以做一個混合的解決方案,並有一個列,如「CustomAttributes」,然後將其用於將由管理員添加的屬性。這應該是相當小的數量,這應該不會影響搜索太多? – realtek

+0

錯誤 - 完全是事實。請參閱SQL Server具有XML字段類型,然後在內部將其解構爲各個部分,並且可以有適當的索引,並且我們是否支持相當高效的查詢。所以,你沒有使用LIKE卡住。在tsql中有一個很好的查詢語言擴展 - 例如,查看http://stackoverflow.com/questions/13195922/how-to-query-xml-column-in-tsql。 – TomTom

+0

好吧,我的壞。這取決於你@realtek。但是,如果您正在執行存儲過程中的大部分業務邏輯而不是編程語言,那麼這是最好的。我不知道,但我認爲這種類型的設置對於服務器來說代價高昂,而且更難實施。 –