2011-05-19 59 views
0

對於100%閱讀(不寫)的表,哪種結構更好,爲什麼?適用於最快查找的最佳MySQL表結構

[我表有許多列,但我已經與4列爲了簡單起見,在此所作的示例]

選項1:具有多個列

ID | Length | Width | Height 
----------------------------------------- 
1 | 10  | 20  | 30 
2 | 100  | 200  | 300 

選項2一個表:兩張桌子;一個存儲列報頭,以及其他存儲值

表1:

ID | Object_ID | Attribute_ID | Attribute_Value 
------------------------------------------ 
1 | 1   | 1   | 10 
2 | 1   | 2   | 20 
3 | 1   | 3   | 30 
4 | 2   | 1   | 100 
5 | 2   | 2   | 200 
6 | 2   | 3   | 300 

表2:

ID | Name 
------------------- 
1 | Length 
2 | Width 
3 | Height 

回答

0

我會通過說我是一個SQL和數據庫表的相對新手,然而,這並不意味着我不瞭解我的基本知識。

除非你的例子嚴重過度簡化,否則你應該使用第一個例子。它不僅更快,更容易查詢,而且更具有意義。

在此示例中,根本不需要拆分表;您的'屬性ID'由表頭充分表示。而且,這些價值本身並沒有真正的意義,所以他們真的不需要在另一個表中。

如果您有另一個單獨存在的與您的對象有一對多關係的對象,您通常會分出一個新表並引用它。

這裏使用的博客條目博客條目和評論(其實從我的O'Reilly的服務器上的數據庫)的例子:

mysql> select * from blog_entries; 
+----+--------------+-------------+---------------------+ 
| id | poster  | post  | timestamp   | 
+----+--------------+-------------+---------------------+ 
| 1 | lunchmeat317 | blah blah | 0000-00-00 00:00:00 | 
| 2 | Yongho Shin | yadda yadda | 0000-00-00 00:00:00 | 
+----+--------------+-------------+---------------------+ 
2 rows in set (0.00 sec) 

mysql> select id, blog_id, poster, post, timestamp from blog_comments; 
+----+---------+--------------+----------------+---------------------+ 
| id | blog_id | poster  | post   | timestamp   | 
+----+---------+--------------+----------------+---------------------+ 
| 1 |  1 | lunchmeat317 | humina humina | 0000-00-00 00:00:00 | 
| 2 |  1 | Joe Blow  | huh?   | 0000-00-00 00:00:00 | 
| 3 |  2 | lunchmeat317 | yakk yakk yakk | 0000-00-00 00:00:00 | 
| 4 |  2 | Yongho Shin | lol   | 0000-00-00 00:00:00 | 
+----+---------+--------------+----------------+---------------------+ 
4 rows in set (0.00 sec) 

mysql> 

想想看,從邏輯的角度來看;當它不需要在那裏時,沒有必要人爲地將複雜性注入到這個設計中。在你的例子中,長度,寬度和高度並不是真正獨立的對象,它們都與你在表格行中描述的對象的尺寸有關。此外,長度寬度和高度在給定時間只有一個值。

我希望這是有道理的 - 如果我在我的教學法中有點迂腐,我很抱歉。但是,如果有人在這個問題上絆倒,希望這個例子能夠幫助他們。

祝你好運。

編輯:我剛纔意識到你的問題是關於性能的。這是更深入一點,也許基於你使用的數據庫引擎?不過,一般來說,我認爲查詢表格而不進行任何連接會稍微快一些,因爲反規範化是一種常見的提高性能的方法。

4

你的第二個選項是EAV反圖案的下優化的實現:

Entity-Attribute-Value Model

爲什麼它在這個網站和其他地方已經被認爲是死亡。

你會從第一個得到更好的結果。