php mysql - 我应该在表中添加字段“category-name”吗?

时间:2012-02-13 11:53:12

标签: php mysql

您认为获得新闻系统的类别名称的更好方法是在性能方面如何:

  1. 在表格中为cat-names添加一个额外字段,allreade包含cat-id的字段

  2. cat-name没有额外的字段,但cat-id和cat-names(逗号分隔的字符串:“cat1,cat2,cat3,cat4”)读入现有的php文件中配置文件,然后在db-field“cat-ids”数组和for循环的帮助下构建cat-names?

  3. 提前完成,

    杰登

    编辑:似乎无法在帖子顶部添加“hi”或“hallo”,编辑只是将其删除...

6 个答案:

答案 0 :(得分:1)

我想到了两种可能的方式。

  1. 拥有category表,articles表和relationship表,并在类别和文章之间建立多对多关系(如{{1}中所述) } table)。
  2. 如果您今天感觉很聪明,请将每个类别声明为二进制数字(0,1,2,4,8,16等),并将它们添加到relationship表的字段中。如果文章的articles值为11,则其类别为1 + 2 + 8。
  3. 坦率地说,我更喜欢第一种解决方案。

答案 1 :(得分:1)

如果您正在测量毫秒并且系统的磁盘IO不是非常慢,那么选项2将产生更好的性能。 但是,我们谈论的执行时间增长微不足道。由于您已经在查询数据库以获取新闻项目,因此它将进行高度优化,以便同时获取类别名称。我会将 category-name-id 的映射表添加到 category-names 。获得新闻时加入即可。

从灵活性的角度和消除尽可能多的错误来源的观点来看,我也会考虑上述想法。因为它为您的系统增加了灵活性,并将您的所有数据保存在一个位置。更改类别的名称需要在数据库中编辑一列而不是编辑php配置文件,或者,如果使用选项1,则更新每条新闻记录。

所以我最好的建议是,将 category-name-id 的表格添加到 category-names 映射,然后让新闻项目包含他们类别的ID属于。

对于性能,您可以缓存您检索的有关现有类别和其他数据的数据,这样您就不必一直轮询数据库以获取该信息。

例如。你可以,而不是加入,从上面描述的类别表中获取所有类别。将其缓存在应用程序中,只有在缓存失效后才能获取它。即发生超时或操纵数据库中的数据。

答案 2 :(得分:1)

我会创建一个这样的类别表:

Categories
-----------
category_id       name
-------------------------
1                 Weather
2                 Local
3                 Sports

然后创建一个junction表,因此每篇文章可以有0个或更多类别:

Article_Categories
-------------------
article_id        category_id
-----------------------------
1                 2
1                 3
2                 1

要从MySQL服务器获取带有类别(逗号分隔)的文章,您可以使用GROUP_CONCACT()

SELECT a.*, GROUP_CONCAT(c.name) AS cats
FROM Articles a
LEFT JOIN Article_Categories ac
  ON ac.article_id = a.article_id
LEFT JOIN Categories c
  ON c.category_id = ac.category_id
GROUP BY a.article_id

答案 3 :(得分:0)

添加一个附加表,以便将来为您节省大量问题。这只是推荐的方式。

顺便说一句,在一个领域中有多个id的想法,不要那样试试。它将提供许多完全没必要的代码和问题。如果您确实发现性能问题,则可以始终决定更进一步,并对某些数据进行反规范化或缓存。有很多缓存选项可用。

答案 4 :(得分:0)

我认为你的第一个选择是合适的。因为它与您的数据的关系是有意义的。在某种情况下,您希望使用您的新闻显示类别名称,您只需通过单一选择查询即可获得所有内容。

所以我建议你提到的选项1。

性能也可以通过两种方式衡量。执行性能和开发性能我觉得两种性能都与您的选项1处于良好的位置。您不需要只做一个查询。如果你选择选项2,那么你必须从配置文件加载,用逗号分解它,然后使用耗时的数组元素进行搜索。

答案 5 :(得分:0)

我可能错了,但既然您已经查询了数据库,那么在那里添加名称字段可能会更快。

请注意,在ID中显示同名表中的名称会提供一致性 - 如果您有配置文件,则必须在表格中添加新类别。 还要考虑可能将错误数据放入配置文件的错误 - 如果是这种情况,您的类别名称可能会搞砸..