PHP 我应该将字段"category-name"添加到表中吗?



您认为从性能角度来看,获得新闻系统类别名称的更好方法是什么:

  1. 在表中为cat名称添加一个额外的字段,allreade包含一个用于cat id 的字段

  2. 没有额外的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以获取这些信息。

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

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

  1. 具有category表、articles表和relationship表,并且类别和文章之间具有多对多关系(如relationship表中所述)
  2. 如果你今天觉得自己很聪明,可以将每个类别声明为一个二进制数(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放在同一个表中可以提供一致性——如果您有配置文件,则必须在表中添加一个新类别。还要考虑可能的错误,这些错误可能会将错误的数据放入您的配置文件中——如果是这种情况,您的类别名称可能会出错。。

最新更新