0

我一直在创建博客,但无法确定对文章进行分类的最佳方式。

我认为最好的当前方法是将类别包含在文章表中,其中包括以下行。

  articles structure
+----------------------+
| article_id           |
| article_title        |
| article_content      |
| article_category     |
+----------------------+

在我写的每篇文章中,我都会包含文章类别。例子。

+------------+---------------+------------------+------------------+
| article_id | article_title | article_content  | article_category |
+------------------------------------------------------------------+
|     1      | How do I....  | Want to know...  |      How-to      | 
|     2      | Learn faceb.. | Facebooks new... |  Social Network  | 
+------------+---------------+------------------+------------------+

然后使用if(isset($_GET['article_id']) && isset($_GET['article_category'])){ }一起检索两者,还是为特定类别创建一个新表会更好?下面的一个例子。

  categories structure
+-----------------+
| category_id     |
| category_title  |
| article_id      |
+-----------------+

并且每当我需要根据类别检索文章时,我只需从类别表中使用它(上面的类别结构只是一个示例)?

另外,如果有人能抽出一点时间来回答一个简单的问题,我将不胜感激。我将使用上面的文章表作为信息的示例。

而不是使用以下内容来检索文章,

www.example.com/article.php?article_id=1&article_category=How-to

我想如下显示文章网址,这可以通过使用 mod_rewrite 来完成,还是我需要在我的服务器中创建文件夹才能实现?

www.example.com/How-to/How-do-i

stackoverflow 是否使用 mod_rewrite 来执行以下操作?

www.stackoverflow.com/questions/id/title?

注意:我知道如何在 url 中显示标题,我一直想知道的只是重写。

感谢您的时间。

4

3 回答 3

1

看看使用pivot表。这不是 MySQL 中一些花哨的数据类型,而只是关于如何组织数据的概念。这个想法类似于Many To Many关系。许多文章与许多类别有关系。这也使您可以灵活地将多个类别分配给一篇文章。Laravel 之类的 PHP 框架让这种关系变得轻而易举。这是一个基本的概述。

文章表

articles structure
+-----------------+
| id              |
| article_title   |
| article_content |
+-----------------+

类别表

categories structure
+-----------------+
| id              |
| category_title  |
+-----------------+

然后,您使用数据透视表在文章和类别之间建立不同的关系。

categories_articles 表

articles_categories structure
+-----------------+
| id              |
| article_id     |
| category_id      |
+-----------------+

在此数据透视表中,您可以为同一篇文章设置多行以指示该文章的多个类别。最后,你会做这样的事情。

<?php

$article = // Get the article you want, including it's id.

$categoryIds = // SELECT * FROM categories_articles WHERE article_id = $article['id']

$categories = // SELECT * FROM categories WHERE id = (Each of the $categoryIds)

这显然是伪代码,您实际上可以通过一个 SQL 查询完成所有这些,但您明白了。

于 2013-11-12T22:58:29.997 回答
1

您想要的是常规的1:n 关系。一篇文章可以有一个分类,一个分类可以有多篇文章。这可以通过两个不同的模型来解决,其中一个模型保存另一个模型元素的标识符。就 SQL 而言:您将在其中articles保存两个表category_id(请记住:一篇文章一个类别,所以这是一个正确的实现)。

  articles
+----------------------+
| article_id           |
| article_title        |
| article_content      |
| category_id          |
+----------------------+

  categories
+-----------------+
| category_id     |
| category_title  |
+-----------------+

这通常使用外键约束来完成。完成后,SQL 会检查条目是否有效(因此文章不能有category_id表中不存在的数字categories)。这也将允许您指定,例如,一旦一个类别被删除,所有引用的文章也应被删除,或者不。

如果您希望一篇文章能够有多个类别,您正在寻找n:m 关系。在 SQL 中创建第三个表

articles_categories
+-----------------+
| article_id      |
| category_id     |
+-----------------+

这两个属性都构建了主键,每个属性也是一个外键。


对于您的第二个问题:是的,这可以通过 mod_rewrite 轻松完成。那里有很多教程,应该很简单。SO可能也使用它,但我不能肯定地告诉你。

于 2013-11-12T22:58:51.397 回答
1

至于从数据库中存储/获取数据,一个非常简单的方法是拥有三个表。文章表将保持不变,但类别表需要从中删除文章 ID。第三个表将映射两者之间的 M:N 关系,如下所示:

id   | article_id |  cat_id
---------------------------

当一篇文章与一个类别一起保存时,将在此表中放入一个新条目(我们将其称为articles_categories_map)以将两者关联起来。当您想按类别检索所有文章时,查询将是:

SELECT `article_id` FROM `articles` INNER JOIN `articles_categories_map`
ON `articles`.`id`=`articles_categories`.`article_id` INNER JOIN `articles_categories` 
ON `articles_categories_map`.`category_id`=`articles_categories`.`id`
WHERE `articles_categories`.`title` = ""

注意:这种方法允许您将多个类别附加到一篇文章,反之亦然。

至于重写你的 URL,mod_rewrite 当然可以做到这一点。使用 MVC 时,您应该花一点时间研究解决此问题的常用方法。这将使您深入了解您可能希望如何构建规则。

干杯

于 2013-11-12T23:02:51.380 回答