2013-07-04 155 views
0

我已經嘗試了兩種方法,但我無法決定在輸入大小增加時哪一種方法會更好。MySQL體系結構優化

首先後面的故事:

我們的產品,每個產品都有一個類別路徑(例如配件鞋,運動鞋)

我想我的產品,以及它們各自的類別連接,同時保持兼容的東西與3NF規則。

我可以去這兩個方面,我可以:

  1. 擁有很多產品和類別之間的一對多關係(通過炸燬類路徑成單獨的類別和形成在許多人的關聯很多表)

    優點:
    簡單易懂。

    缺點:
    許多協會以指數級增長!你可以想象爲什麼,每個產品都有多個類別,測試用例只涉及250,000個產品。我可以直觀地看到,隨着輸入大小的增加,數據庫引擎的壓力將會增加。

  2. 創建類別路徑和產品之間的多對多關係,以及類別路徑和實際類別之間的多對多關係。這對我來說很有意義,因爲250,000個產品的測試用例中的類別路徑限制爲13,000個獨特實例,而在另一個多對多關係中與其實際類別相關聯的這些路徑不超過61,000行。

    優點:
    遠更少類別關聯,用於通過數據庫迅速(61000個協會相比,形成於第一技術900000個協會)

    缺點:
    遠更內部聯接。產品與類別路徑相連,而類別路徑又與多對多關係中的類別相關聯。

您認爲哪種技術更合適?我需要快速檢索,因此快速選擇語句應該是主要標準。

我意識到,這很大程度上取決於正確的索引,但在第一種情況下,行的大小增長至少3倍,因爲在第二種情況下,存在如此多的內部連接,我擔心檢索速度受到負面影響。

回答

0

好的,所以我嘗試了兩種方法。事實證明,第二種技術要快得多。產品和類別之間的映射表不可避免地會返回比category_path和連接到產品表的類別之間的映射表多十倍的行,方法是存儲每個產品的相應類別路徑。

真的很簡單數學。故事的道德:維護一個字典表(Category_Path)及其定義(分類)並通過外鍵將字典表連接到相應的項目(產品)。行數少得讓大家開心:)