2010-12-04 133 views
0

我正在設計我的數據庫並想知道處理此問題的最佳方法。我有一個頁面,看起來像這樣的標籤:將數據保存爲數據庫中的XML與保存多行數據

Tab1 
--SubTab1 
----Data1 
--SubTab1 
--SubTab1 
Tab2 
--SubTab1 
--SubTab1 
--SubTab1 
Tab3 
--SubTab1 
--SubTab1 
--SubTab1 

我可以把數據庫中的信息將被存儲在多個行這樣

TypeID---------------Name 
1--------------------Tab 
2--------------------Data 


ObjectID----------Parent-------------TypeID 
1-----------------0------------------1 
2-----------------0------------------1 
3-----------------0------------------1 
4-----------------1------------------1 

或者我可以把這個在數據庫就像這樣:

<root> 
    <tab name="MyTab"> 
      <tab name="MySubTab"> 
       <data>1234567890</data> 
      </tab> 
    </tab> 
</root> 

如果我剛拉的XML從數據庫中,然後我就不需要選擇多行我只需要選擇一個行然後解析XML轉換爲類,然後傳遞數據控制器。我只想知道這是個好主意嗎?如果我的網站未來可以擴展,我會犯一個錯誤嗎?隨着網站變得更大並且需要更多功能,這會不會進行更多維護?

回答

1

XML很難用SQL查詢。如果您認爲您永遠不需要查詢可以使用XML的數據。爲了將來的靈活性,我可能會將數據存儲在多行中。

+0

這不是很難做(排序需要一些使其變得複雜的黑客,但是: - /) - 如果您直接在TSQL(2008+)中編寫語句,只需要學習模式。話雖如此,我不會使用XML來解決這個問題,因爲「黑客」會得到適當的排序(`position()`沒有得到適當的支持)。 – 2010-12-05 00:20:19

+0

將「hard」讀爲「比查詢跨列和行分割的原始數據要困難」。 – cspolton 2010-12-05 10:13:31

+0

您也可以將「hard」讀作「比查詢跨列和行分割原始數據效率要低效」;這可能更加重要。即使在黑客存在的情況下,它們仍然是黑客,他們會擺脫許多與數據庫相關的效率。 – Murven 2010-12-05 17:44:12

0

如果您的數據是一大塊xml,您不能使用數據庫輕鬆搜索該數據。你需要在XML中搜索信息嗎?分離它將使這項任務更容易。

0

也許我誤解了它,但它似乎決定是否將數據保存爲XML或將其保存在表中,然後使用xml查詢以返回它。如果是這樣的話:

更容易查詢,並能處理更多的變化:保存的數據表和查詢它後來是更好,如果你將有很多的變化,它會在一個較高的速度增長。您爲複雜的查詢獲得更多選擇。

如果數據不增加或更改快得多:如果數據慣於變化,往往並沒有成長爲多,那麼你可以簡單地使用XML來保持它在正確的語法已經是它的危險,它會有更少的性能影響。這種方法意味着您在查詢正確的數據時缺乏靈活性。

0

如果您正在考慮是否將XML存儲在數據庫中,現在應該開始問自己是否需要將數據存儲在數據庫中。

將這些數據存儲在靜態XML文件中怎麼樣?這是一個可行的選擇嗎?爲什麼?爲什麼不?

如果這些數據沒有頻繁變化,並且您不想將旅程投資到數據庫,但您仍然希望確保將來可以使用CMS編輯此數據,那麼也有可能要創建一個使用數據庫中的數據創建靜態XML文件的批處理過程,然後您的應用程序將完全忽略此數據位於數據庫中並僅使用靜態XML文件這一事實。批處理過程將按計劃或按需運行。

這是一種可擴展,可維護且高效的方法來處理不經常更改的數據。

類似的實現方法是使用像ASP.net或PHP這樣的服務器端技術,從數據庫表中爲您生成XML,然後使用輸出緩存和很長的到期時間來確保生成過程不經常運行。

作爲一般的經驗法則,在數據庫字段中存儲非原始數據或複雜數據通常不是一個好主意。

0

如果使用SQL Server,我只會使用hierarchyid。雖然在TSQL中可以處理XML,但有幾點需要注意。最重要的是得到有序的XML回吸,因爲TSQL(2008)不正確/完全支持position()。它需要有點凌亂的連接到'索引器'列。 (如果您閱讀了XML blob後面的整個,但這不適用,但這聽起來像是手頭解析客戶端的頭痛)。

hiearchyid允許這些水平可以很容易地保存,以更加規範化的格式使數據庫(RDBMS」是設計超過許多列有效地工作,只要確保有正確的索引),而應該是更容易在一般情況下處理 - 尤其是如果你還沒有準備好潛入SPROC土地:-)

hiearchyid代表父/子關係,以及兄弟姐妹進行排序(它真的可以收拾模型);它基於深度優先模型,適用於這樣的任務。另外,使用XML可能不會保存任何內容(IIRC,[typed] XML實際上已經分解爲某種內部列設置)。如果需要,它(XML)更好地用作「輸入/輸出」消息格式(或「文檔」)。

快樂SQL'ing。