您认为从性能角度来看,获得新闻系统类别名称的更好方法是什么:
-
在表中为cat名称添加一个额外的字段,allreade包含一个用于cat id 的字段
-
没有额外的cat名称字段,而是cat id,并通过现有的配置文件将cat名称(逗号分隔的字符串:"cat1,cat2,cat3,cat4")读入php文件,然后在db字段"cat id"的帮助下构建cat名称一个数组和一个for循环?
提前Thanx,
Jayden
edit:似乎无法在帖子顶部添加"hi"或"hallo",编辑器只是将其删除…
如果测量的是毫秒,并且系统的磁盘IO不是非常慢,那么选项2会产生更好的性能但是,我们谈论的是执行时间的微不足道的增加。由于您已经在查询DB以获取新闻项目,因此将对其进行高度优化,以便同时只获取类别名称。我将添加类别名称id到分类名称的映射表。以及获取新闻项目时的加入。
从灵活性的角度和消除尽可能多的错误来源的角度来看,我也同意我的上述想法。因为它为您的系统增加了灵活性,并将您的所有数据保存在一个位置。更改类别的名称需要编辑数据库中的一列,而不是编辑php配置文件,或者,如果使用选项1,则需要更新每条新闻记录。
因此,我最好的建议是,向类别名称映射添加一个具有分类名称id的表,然后让新闻项目包含它们所属类别的id。
为了提高性能,您可以缓存检索到的关于现有类别和其他数据的数据,这样您就不必一直轮询DB以获取这些信息。
例如。您可以从我上面描述的类别表中获取所有类别,而不是加入。在应用程序中缓存它,并且只有在缓存无效时才能获取它。即发生超时或数据库中的数据被操纵。
我想到了两种可能的方法。
- 具有
category
表、articles
表和relationship
表,并且类别和文章之间具有多对多关系(如relationship
表中所述) - 如果你今天觉得自己很聪明,可以将每个类别声明为一个二进制数(0、1、2、4、8、16等),并将它们添加到
articles
表的一个字段中。如果一篇文章的category
值为11,则它具有类别1+2+8
坦率地说,我更喜欢第一种解决方案。
我会创建这样的类别表:
Categories
-----------
category_id name
-------------------------
1 Weather
2 Local
3 Sports
然后创建一个连接表,这样每个文章都可以有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
添加一个额外的表,这将为您节省未来的许多问题。这只是推荐的方式。
顺便说一句,在一个字段中有多个id的想法,不要这样做。它会给出很多完全不必要的代码和问题。如果您真的发现了性能问题,您可以决定更进一步,取消规范化或缓存一些数据。有很多可用的缓存选项。
我认为您的第一个选项是合适的。因为它与您的数据之间的关系是有意义的。在您想在新闻中显示类别名称的情况下,您只需通过带有联接的单选查询即可获得所有信息。
所以我推荐你提到的方案1。
性能也可以通过两种方式来衡量。执行性能和开发性能我觉得这两个性能都适合您的选项1。您不需要做太多,只需要一个查询。如果选择选项2,则必须从配置文件加载,用逗号分解,然后使用数组元素进行搜索,这很耗时。
我可能错了,但由于您已经查询了数据库,如果在那里添加一个名称字段,可能会更快。。
还请考虑到,将名称与ID放在同一个表中可以提供一致性——如果您有配置文件,则必须在表中添加一个新类别。还要考虑可能的错误,这些错误可能会将错误的数据放入您的配置文件中——如果是这种情况,您的类别名称可能会出错。。