【问题标题】:How to normalize mysql database table如何规范化mysql数据库表
【发布时间】:2016-02-04 13:18:51
【问题描述】:

对于一个 mysql 数据库,我有两个相似的表:

1.st 表 track_tag(200 万行)

id (int), track_id (int), tag (varchar)

第二张表 标记(150.000 行)

id (int), tag(varchar)

我想用第二个表的主键规范第一个表标记列。 解决这个问题的最快方法是什么?

【问题讨论】:

  • 每个track_id 对应一个唯一的tag 吗?如果是这样,那么只需从track_tag 中删除tag 列。
  • 最快的方法是什么?设计?两秒钟。实际实施和移动数据?更长。

标签: mysql normalization


【解决方案1】:

假设您不是在生产数据库上工作(因此像长时间运行的查询和删除/重新创建表这样的事情是可以的) - 那么我认为 最快 方法是使用Create Table AS SELECT statement

例如:

CREATE TABLE track_tag_V2 AS SELECT track.id AS id, track.track_id, tag.id AS tag_id
FROM track_tag track, tag
WHERE track.tag = tag.tag
;

然后(假设结构符合您的喜好)只需 DROP track_tag 然后 RENAME track_tag_V2 to track_tag 就完成了!

但是,这可能不是(并且可能不会不是)最佳强>方式。如果您的数据库在这一点上被去规范化,它可能已经出于性能原因已经完成(规范化优化存储,而不是性能)。它也可能需要彻底重新设计(这快)。

【讨论】:

    【解决方案2】:

    您的标签表可以使用以下列:id (int), tag(varchar)

    注意:这里假设 id 字段是主键,否则在其上创建索引。

    但按照以下更改 track_tag 表-

    id(int)、track_id(int)、tag_id(int)

    注意:tag_id 字段应该在这里建立索引。

    这里也不清楚track_id字段是什么。

    【讨论】:

      猜你喜欢
      • 2011-12-16
      • 2013-07-17
      • 1970-01-01
      • 2011-11-12
      • 2017-02-25
      • 2011-05-18
      • 2016-06-06
      相关资源
      最近更新 更多