Mysql避免表到表关系

时间:2012-10-22 16:01:21

标签: mysql

我有两张桌子......

表“标签”

+---------+----------+
|  tag    |   id     |
+---------+----------+
|  nancy  |   902    |
+---------+----------+
|  fred   |   903    |
+---------+----------+
|  suzan  |   904    |
+---------+----------+
|  joe    |   905    |
+---------+----------+

和要标记的表标记

+---------+----------+
|  tag_a  |   tag_b  |
+---------+----------+
|  903    |   902    |
+---------+----------+
|  905    |   903    |
+---------+----------+
|  902    |   904    |
+---------+----------+
|  904    |   905    |
+---------+----------+

我经常使用带有“tag”表的INNER JOIN语句扫描标签到标签关系,以便我可以查询谁与“nancy”相关。我想知道,只要将标签的名称转储到标签到标签表而不是加入标签表以便我可以根据标签名称查找关系,我会更好。加入桌面是否会受到巨大的打击?我的标签到标签表是在900k行范围内。标签表大约是30k。

1 个答案:

答案 0 :(得分:1)

如果您希望存储有关该标记的任何元信息,那么无论如何您都需要一个tag表。添加连接可能会增加查询费用。

在您的情况下,我建议您考虑以下事项:

  1. 使用InnoDB
  2. id更改为TagString
  3. 将实际标记放在TagString
  4. 使用级联更新/删除
  5. Tag表创建外键

    通过这种方式,您可以对单个列进行分组,过滤等,但如果您需要更多信息,则可以加入Tag表(或您需要的任何表)。< / p>

    当我们点击80,000,000个标记记录并且正在进行实时连接以在http://tagcloud.com上生成标记云时,我遇到了MySQL的一些严重的性能问题...有些缓存确实有帮助,但是,它似乎是推动关系数据库的设计限制(以正常形式)。我们最好使用不同的存储格式,写入可能更昂贵,但读取速度更快。