2011-08-23 49 views

回答

3

效率在很大程度上取决于你在做什么。如果您想基于标签名称进行查询,那么如果您在标签和项目表上同时使用标识符(即选项#2)的标签表,则可能会更快。但是,除非你有成千上万的行,否则它可能不会有所作为。如果你根本没有这么多的标签,那么差距会更小。

但是,如果您想通过商品ID获取标签,第一种方法会稍微快一点。再次,我怀疑你会注意到。

还有其他一些考虑因素:数据完整性和规范化。如果您使用两个表和外键,那么让您的标记集与项目保持一致更容易。如果标签被移除,而您只使用一张桌子,则旧的项目仍然会有旧的标签。此外,获取唯一标签列表并保持一致性更容易。如果您在另一个表中有标签,这将打开一个全新的组织世界:您可以为标签创建和修改制作时间戳,将标签标记为活动或非活动状态(可能还有其他状态)等。

-1

一张桌子会更有效率,但有两张桌子通常是存储简单标签的正确方法。

1

第二个选项。分开存储标签。如果将它们存储在单个字段中,您将无法编写好的查询来搜索特定的标记。您不想使用MATCH或LIKE来过滤标签。通过将它们存储在单独的表格中,您可以轻松找到所需的标签以及相关的文章。不过,您的表格确实需要进行正确的索引。

如果您需要查询这些值,请不要在数据库中存储逗号/空格/其他分隔值。数据库的全部本质是以结构化的方式存储数据。这样数据库可以在很大程度上优化数据的检索。

+0

绝对说话(例如:“从不”)可能是危险的。 IIRC StackOverflow例如使用第一个选项作为其标签(以及第二个选项)。 – NullUserException

+0

@NullUserException出于好奇,第一个选项和第二个选项意味着什么? – Lior

+1

当然,你永远不应该说永远。总是有例外。甚至可能有数据库支持在逗号分隔的字段上使用智能索引的“标记”字段类型。但是*一般来说*你不应该以这种方式存储分隔值。如果你还没有那么有经验的话,在你对此事有足够的了解以故意违反一些规则之前,'永不'是一个好的经验法则。 ;) – GolezTrol

0

第二个版本,将数据分割成两个额外的表,是很多更有效,因为它允许数据库使用索引来运行的查询你大多需要(Get all texts with a certain tagget a count of how often the tags are used sorted by count的标签云,和get all tags for the given text

相关问题