对于具有 100% 读取(无写入)的表,哪种结构更好,为什么?
[我的表有很多列,但为了简单起见,我在这里做了一个包含 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
第二个选项是 EAV 反模式的优化实现不足:
实体-属性-值模型
为什么它不好已经在这个网站和其他地方争论得死死的。
你会从第一个得到更好的结果。
首先,我将说我是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>
从逻辑角度考虑它;当它不需要存在时,没有理由人为地将复杂性注入到这个设计中。在您的示例中,长度、宽度和高度并不是真正独立的对象,它们都与您在表格行中描述的对象的尺寸相关。此外,长度宽度和高度在给定时间只有一个值。
我希望这是有道理的——如果我在教学法上有点迂腐,我道歉。但是,如果其他人在这个问题上偶然发现,希望这个例子能帮助他们。
祝你好运。
编辑:我刚刚意识到你的问题专门关于性能。这更深入一些,也许基于您使用的数据库引擎?不过,一般来说,考虑到非规范化是一种经常引用的提高性能的方法,我认为在不进行任何连接的情况下查询表会稍微快一些。