在MySQL和&amp ;;中组织博客类别的最优化方式url mod_rewrite?

时间:2013-11-12 22:49:52

标签: php mysql

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

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

  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?

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

感谢您的时间。

3 个答案:

答案 0 :(得分: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查询完成所有这些,但你明白了。

答案 1 :(得分:1)

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

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

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

通常使用foreign key constraint来完成。完成后,SQL会检查条目是否有效(因此文章不能包含表category_id中不存在的categories编号)。此外,您还可以指定,例如删除类别后,所有引用文章也应删除。

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

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

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


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

答案 2 :(得分: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` = ""

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

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

干杯