2016-12-27 51 views
0

假設我有這4個表,包括各種外鍵關係(例如一個區域必須屬於某個位置,商店必須屬於區域,一個項目的價格必須屬於某個店鋪等..)MySQL的 - 對於這種分層模型中選擇數據的最佳方法是什麼?

---------------------------------- 
|Location Name | Location ID  | 
|    |     | 
---------------------------------- 

------------------------------------------------- 
|Area Name  |  Area ID | Location ID | 
|    |     |    | 
------------------------------------------------- 

------------------------------------------------- 
| Shop Name |  Shop ID | Area ID  | 
|    |     |    | 
------------------------------------------------- 

---------------------------------- 
| Item Price |  Shop ID | 
|    |     | 
---------------------------------- 

我希望和「商品價格」是屬於一個特定的位置ID的。所以所有區域和商店的物品價格總計爲位置id'x'。我發現這樣做

的一種方法是加入所有表的一個位置,並得到量例如:

SELECT SUM(Item Price) FROM 
     items 
     left join shops ON (items.shop id = shops.shop id) 
     left join areas ON (shops.area id = areas.area id) 
     left join locations ON (areas.location id = location.location id) 
    WHERE Location Id = 4; 

然而,這是做到這一點的最好辦法,因爲它涉及檢索的全樹數據並將其過濾掉?如果有一百萬行,會有更好的方法嗎?或者這是最好的方法嗎?

+0

是 - 這似乎是最好的辦法。聯接是一個數據庫的好處。 – Randy

回答

0

你可以試試子查詢 -

SELECT SUM(項目價格)FROM 項目 左加入ON(items.shop ID = shops.shop ID) 左加入商店(選擇的區域,其中區域ID地址Id = 4)as Ar ON(shops.area id = areas.area id)

0

如果您定義了正確的索引,則查詢不會讀取每個表的所有數百萬行。

想想電話簿以及如何查找一個名字。你是否閱讀了整本書的封面來涵蓋尋找名字?不,您利用這本書按姓氏,名字排序並直接轉到名稱這一事實。只需幾次嘗試即可找到正確的頁面。事實上,平均大約需要登錄ñ嘗試了一本書,在它ñ名。

同一種搜索會爲每個加盟。如果您有索引,則每個比較表達式都使用類似的查找來查找連接表中的匹配行。這很快。

但如果這不夠快,你也可以使用非規範化,在這種情況下會被存儲在一個表中的所有數據,有許多列寬。

---------------------------------------------------------------------- 
|Location Name | Area Name | Shop Name | Item Name | Item Price | 
|    |   |   |   |    | 
---------------------------------------------------------------------- 

非規範化的優點是它避免了某些連接。它存儲行,就像您從示例的結果集中加入SQL查詢所獲得的行之一一樣。您只需從表格中讀取一行,即可獲得所需的全部信息。

非規範化的缺點是數據的冗餘存儲。據推測,每家商店都有很多物品。但是每個項目都存儲在自己的一行中,這意味着該行必須重複商店,區域和位置的名稱。

通過重複存儲這些數據,您可以爲「異常」創建機會,例如,如果您更改了指定商店的名稱,但是您錯誤地將其更改爲僅在幾行而不是商店名稱出現的位置。現在你有兩個同名商店的名字,而其他人在查看數據庫時無法知道哪一個是正確的。

一般來說,維護多個標準化表格是可取的,因爲每個「事實」只能存儲一次,所以不會出現異常情況。

創建索引以幫助您的查詢對於大多數應用程序來說已足夠。

你可能會喜歡我的介紹,How to Design Indexes, Really,並且視頻:https://www.youtube.com/watch?v=ELR7-RdU9XU

相關問題