您认为获得新闻系统的类别名称的更好方法是在性能方面如何:
在表格中为cat-names添加一个额外字段,allreade包含cat-id的字段
cat-name没有额外的字段,但cat-id和cat-names(逗号分隔的字符串:“cat1,cat2,cat3,cat4”)读入现有的php文件中配置文件,然后在db-field“cat-ids”数组和for循环的帮助下构建cat-names?
提前完成,
杰登
编辑:似乎无法在帖子顶部添加“hi”或“hallo”,编辑只是将其删除...
答案 0 :(得分:1)
我想到了两种可能的方式。
category
表,articles
表和relationship
表,并在类别和文章之间建立多对多关系(如{{1}中所述) } table)。relationship
表的字段中。如果文章的articles
值为11,则其类别为1 + 2 + 8。坦率地说,我更喜欢第一种解决方案。
答案 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中显示同名表中的名称会提供一致性 - 如果您有配置文件,则必须在表格中添加新类别。 还要考虑可能将错误数据放入配置文件的错误 - 如果是这种情况,您的类别名称可能会搞砸..