2012-12-09 9 views
1

請考慮下面的例子。假設我們正在爲在線書店構建數據庫。我們有一個Book表包含n條記錄,一個Type表包含m條記錄。 n是一個非常大的數字。 m很小。MySQL可以加入XML字段(或JSON)嗎?

-------- 
Book 
--------- 
BookId 
BookName 
BookType 
--------- 

------- 
Type 
-------- 
TypeId 
TypeName 
--------- 

傳統的方式加入這兩個表將創建一個名爲的BookType

---------- 
BookType 
---------- 
BookTypeId 
BookId 
TypeId 
---------- 

如果我們想要檢索與類型一本書記錄第三表格中,我們可以這樣做:

select B.*, T.Name from Book B 
inner join BookType BT on B.BookId = BT.BookId 
inner join Type T on BT.TypeId = T.TypeId 

由於Book表非常大,所以BookType表甚至更大。由於數據庫索引使用的是類似B樹的算法,因此時間成本爲:2log(n)+ Cm。對? (隨着書籍表和表的BookType索引)

但是,如果我們能在TYPEID存儲爲一個JSON數組,並使用它的加入,那麼我們就可以在一次旅行中獲取數據。時間將是log(n)+ Cm,它至少快兩倍。語法可能類似於:

select B.*, T.Name from Book B 
inner join Type T on ParseJsonAsIntArray(BookType) = T.TypeId 

我找不到類似ParseJsonAsIntArray()的MySQL函數。他們爲什麼不這樣做?如果我錯過了明顯的道歉。

回答

2

不,在MySQL中沒有用於解析JSON的內建函數。最接近的是用於XML數據的ExtractValue()。該函數使用Xpath表達式來挑出XML文檔的元素。但無論如何,MySQL都不支持在XML或JSON這樣的半結構化blob中索引元素。這肯定是一個低效率的查詢。

但首先要事。您正在嘗試使用反規範化來解決實際上是關係數據庫優勢的問題。 BookType表格會很長,但行數很小。所以它不會像你想象的那麼糟糕。

它是BookType支持索引的搜索或者通過BookType一個巨大的優勢。當你反規範化時,你基本上使其中一個查找效率更高,但是你犧牲了其他查找。

另請參閱我的回答Is storing a comma separated list in a database column really that bad?

+0

我明白了。所以如果查詢是單向的,那麼標準化會更快,對嗎?我不認爲我會這樣做,因爲它聽起來像對我來說很多額外的代碼。只是好奇他們爲什麼沒有它。 –

+0

自2010年以來請求的功能:http://bugs.mysql.com/bug.php?id=55308 –

相關問題