2011-05-19 58 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

为什么它在这个网站和其他地方已经被认为是死亡。

你会从第一个得到更好的结果。