关于多个类别的一篇文章

时间:2011-10-24 06:32:11

标签: php mysql database-design

我需要在多个类别中添加文章 例如,我有文章名称'测试文章'需要将其添加到类别1和类别2 需要知道如何在这个

的表之间建立关系

注意:在过去我在文章数据库表名称'category'中添加行并添加类别ID,如1,2,3但这会在搜索和列表中产生问题请帮我解决这个问题

3 个答案:

答案 0 :(得分:6)

您需要三张桌子:

  • articles
  • 的一个表格
  • categories
  • 的一个表格
  • 将文章与类别相关联的一个表格,我们可以将其称为categories_per_article。此表通常称为Junction table or a Association table

示例数据:

ARTICLES
ID | Name | Description
1  | Fuzz | A fuzzy three
2  | Bizz | A five that means bizznezz

CATEGORIES
ID  |  Name 
1   |  Prime numbers
2   |  Multiples of five
3   |  Smaller than four

CATEGORIES_PER_ARTICLE
ID | ARTICLE_ID | CATEGORY_ID
1  | 1          | 1
2  | 1          | 2
3  | 1          | 3
4  | 2          | 1

你会看到第1条(Fuzz)有三个类别,第2条(Bizz)只有类别1.我们称之为many-to-many relationship(或者n到n,例如在ER或UML中) ),因为第1条有多个类别,而第1类由多篇文章使用。

您可以使用此架构执行所有可能的查询 - 随意在评论中询问特定示例(例如How do I get all articles which have categories 1 and 3 but not 2)。

答案 1 :(得分:1)

文章与类别之间的联系是一种n对n的关系 一篇文章可以属于多个类别,一个类别可以附加到多篇文章。

因为SQL不直接支持n对n关系,所以需要一个链接表。

Table article_cats
------------------
cat_id integer,
article_id integer,
primary key (cat_id, article_id)

然后您可以链接文章:

SELECT a.name, GROUP_CONCAT(c.name) as cats
FROM articles a
LEFT JOIN article_cats ac ON (a.id = ac.article_id)
LEFT JOIN cats c ON (c.id = ac.cat_id)
GROUP BY a.id

答案 2 :(得分:0)

这里有多对多的关系:文章可以有多个类别,而类别显然可以包含多个文章。如果没有至少一个明确存储实体之间关联的表,则无法正确表示。