哪个更合适?联接2个表或在表中使用附加列

时间:2019-04-12 10:24:26

标签: mysql database left-join tablecolumn

表A1:

zip(*lst)

表B1:

| id | name  | code | level |
|  1 | Anton | A111 |     2 |
|  2 | Berta | A112 |     5 |

表B2:

| id | name  | code |
|  1 | Anton | A111 |
|  2 | Berta | A112 |

哪个更合适?

使用表A1(级别列):

| id | code | level |
|  1 | A111 |     2 |
|  2 | A112 |     5 |

OR

按联接使用表B1和表B2(代码列):

SELECT 'id,name' FROM A1 WHERE level=2;

谢谢。

2 个答案:

答案 0 :(得分:2)

对该问题的一般回答是,最好使用两个单独的表,而不是联合/组合版本A1。原因是 normalizaion 的原理。考虑一种情况,其中给定的名称/代码与更多匹配的级别超过一个,例如此B2

| id | code | level |
|  1 | A111 |     2 |
|  1 | A111 |     3 |
|  1 | A111 |     4 |
|  2 | A112 |     5 |

现在加入将产生下表:

| id | name  | code | level |
|  1 | Anton | A111 |     2 |
|  1 | Anton | A111 |     3 |
|  1 | Anton | A111 |     4 |
|  2 | Berta | A112 |     5 |

请注意,上表包含重复信息。我们将名称/代码复制/存储3次。实际上,如果使用两个表版本,则可以避免这种额外的存储成本。

使用A1表的一个可能的理由是,如果您需要快速的闪电查询来提取信息,并且希望避免联接。但是,在遇到这种情况之前,您首先要研究诸如索引之类的东西,通常可以在采用非规范化表设计之前将其加快速度。

答案 1 :(得分:0)

第一种情况(带有一个表)将更快地工作。 另外,在第一种情况下,您还有一个varchar键,因此SELECT查询的工作速度要比使用整数键慢。

如果要在SELECT查询中连接两个表,有时最好将链接表中的某些字段存储在第一个表中。

例如,您有一个包含字段town_id的Users表和一个具有town_name的Town表。 如果城镇名称存储在“用户”表中,则查询用户信息和城镇名称的速度更快。