0

为这个冗长的话题道歉,我不打算让它这么长,但这是我一直遇到的一个非常简单的问题。:)

假设您有一个名为的简单表tags,其中包含列tag_idtag. tag_id 只是一个自增列,而 tag 是标签的标题。如果我需要添加一个描述字段,平均大约 1-2 段(最多大约 3-4 段),我应该简单地向表中添加一个描述字段还是应该创建一个名为 tag_descriptions 的新表并存储带有 tag_id 的描述?

我记得读过最好这样做,因为如果您执行不选择描述的查询,该描述字段仍然会减慢 mysql。这是真的?我什至不记得我从哪里读到的,但我已经追了几年了……最后我怀疑我是否需要这样做,我有一种感觉,我不需要。每当您需要描述字段时,您还需要进行内部连接。

我的另一个问题是,创建最多只能容纳很少行的新表通常是不好的吗?如果这些数据不适合其他任何地方怎么办?

我在下面有一个与这两个问题有关的简单案例。

我有三个表内容、标签和 content_tags,它们构成了多对多关系:

内容

  • content_id
  • 区域(具有大约 6-7 个不同值的枚举列,以后很可能不会增长)

标签

  • tag_id
  • 标签

内容标签

  • content_id
  • tag_id

我想为每个标签存储大约 1-2 段的描述,但也为每个区域存储。我想知道最好的方法是什么?

选项 A:

  • 只需在标签表中添加描述列
  • 为 region_descriptions 创建一个新表

选项 B:

  • 创建一个名为 descriptions 的新表,其中包含以下字段:id、description 和 type
  • id 将是内容的 id 或枚举字段的 id
  • 类型是标签描述还是区域描述(将使用枚举列)

也许在 id 和 type 上有一个主键?

选项 C:

  • 为 tag_descriptions 创建一个新表
  • 为 region_descriptions 创建一个新表

如果添加描述列不会减慢不需要描述的 mysql 选择查询,选项 A 似乎是一个不错的选择。

假设描述列会减慢 mysql,选项 B 可能是一个不错的选择。它还消除了对仅包含 6-7 行来保存区域描述的小表的需要。虽然现在我想起来了,如果最初要获得区域描述,那么连接到这个表会很慢,你只需要经过很少的行。

如果描述列会减慢 mysql 的速度并且如果像区域描述这样的小表无关紧要,选项 C 将是理想的。

也许这些选项都不是最好的,请随时提供其他选项。谢谢。

PS 什么是理想的列类型,用于保存通常 1-2 段的数据,但有时可能会更多?

4

3 回答 3

0

在我(诚然有些不知情)看来,这实际上取决于您将使用它们的程度。

如果正确索引,则该 JOIN 应该不会很昂贵。此外,更大的表会更慢。它禁止缓存,并且需要更长的时间来访问内容,尽管索引可以严重缓解这个问题。

如果您将标签名称连接到标签 ID 很多,并且很少会使用描述,我会说使用单独的表。如果您将更频繁地使用描述,请使用一张桌子。

于 2011-01-20T19:27:07.260 回答
0

对于您问题的第一部分:如果您有一个带有 id、名称和描述的标签,您应该将其保存在 1 个表中。

现在,这个查询

 SELECT name FROM tags WHERE id = 1;

如果您有 1、2 或 20 个额外字段,则不会放慢速度。

于 2011-01-20T19:27:59.347 回答
0

如果您每分钟不处理数千个查询,我认为这并不重要。如果您每分钟要进行无数次查询,那么我将实施各种选项并为所有这些选项执行基准测试。根据结果​​,您可以做出决定。

于 2011-01-20T19:36:59.093 回答