【发布时间】:2014-01-12 10:31:46
【问题描述】:
我一直想知道是否需要标准化。我主要关心的不是这些表的可读性和易用性,而是速度。以汽车桌为例。假设这个汽车表有超过 10,000 条记录。
我的问题是:进行多次连接所花费的时间是否值得更好地设计数据库系统?以及执行 '%%' 查询与联接有什么区别
汽车
-------------------------------------------------------------
|CarID |Car_Name | Car_Features |
-------------------------------------------------------------
|F31344 | Corolla | Sedan - Sun Roof Power Lock Manual 4WD |
-------------------------------------------------------------
并进行如下查询:
- 从 Car_Features 类似 '%4WD'% 的汽车中选择 Car_ID、Car_Name、Car_Features;
- 从 Cars where Car_Features like '%Manual Sun Roof%' 中选择 Car_Name;
持续时间/获取时间相对较快。
与标准化方法相比。
汽车
------------------------------------------
|Car_ID | Car_Name |Transmission|Features|
------------------------------------------
|F31344 | Corolla | M4WD | EX1 |
------------------------------------------
传输
---------------------------------
|ID | Drive | Manual |
--------------------------------
|M4WD | 4WD | 1 |
--------------------------------
Features
---------------------------------
|Features | Sun_Roof | Power_lock|
---------------------------------
|EX1 | 1 | 0 |
---------------------------------
现在我必须编写连接来完成同样的事情。以及在我的原始表中引入两个新表和两个查找列。
> 1.Select Car_ID,Car_Name,Drive From Cars inner join Transmission
> ON Cars.Transmission = Transmission.ID
> Where Drive = '4WD';
【问题讨论】:
-
这完全取决于一千件事,没有足够的时间在这里分享。我能给出的最佳答案是一个意见:根据需要开始规范化和非规范化。
-
规范化用于减少数据冗余,在某些情况下,数据被非规范化以提高性能。但请记住您的业务需求,您可以在中间的某个地方解决,而不会在两端做出太大的妥协。
-
为什么这个标签同时用于 MySQL 和 SQL Server?您使用的是哪个数据库?
-
10k 行很小。尽管如此,表达式
like '%4WD'%是不可分割的。 (它不能使用索引。)另请注意,您已经考虑(或错误考虑)可读性、易用性和速度,但您没有考虑数据完整性。 -
我赞同@MikeSherrill'Catcall' 所说的话。加入实际上会比全表扫描(您现在拥有的)更快。对于仅 10000 行可能不太重要,但在较大的表上可能意味着毫秒和分钟(或更多)之间的差异。