mysql – 数据库设计启用多个标签,如Stackoverflow?
作者:互联网
我有以下表格.
Articles table
a_id INT primary unique
name VARCHAR
Description VARCHAR
c_id INTCategory table
id INT
cat_name VARCHAR
现在我只是使用
SELECT a_id,name,Description,cat_name FROM Articles LEFT JOIN Category ON Articles.a_id=Category.id WHERE c_id={$id}
这给了我所有属于某个类别的文章以及类别名称.
每篇文章只有一个类别.
我以类似的方式使用子类(我有另一个名为sub_cat的表).但是每篇文章都没有必要的子类.它可能属于多个类别.
我现在想到标记一个包含多个类别的文章,就像stackoverflow上的问题被标记一样(例如:有多个标签,如PHP,MYSQL,SQL等).之后我必须显示(过滤)所有带有某些标签的文章(例如:用php,php MySQL标记)我还必须显示标签以及文章名称描述.
任何人都可以帮我重新设计数据库吗?(我在后端使用php MySQL)
解决方法:
创建一个新表:
CREATE TABLE ArticleCategories(
A_ID INT,
C_ID INT,
Constraint PK_ArticleCategories Primary Key (Article_ID, Category_ID)
)
(这是SQL服务器语法,对于MySQL可能略有不同)
这称为“连接表”或“映射表”,它是您在SQL中表达多对多关系的方式.因此,只要您想要将一个类别添加到文章中,只需使用文章和类别的ID将一行插入此表中.
例如,您可以像这样初始化它:
INSERT Into ArticleCategories(A_ID,C_ID)
SELECT A_ID,C_ID From Articles
现在,您可以从“文章”表中删除c_id.
要获取单个文章的所有类别,您可以使用如下查询:
SELECT a_id,name,Description,cat_name
FROM Articles
LEFT JOIN ArticleCategories ON Articles.a_id=ArticleCategories.a_id
INNER JOIN Category ON ArticleCategories.c_id=Category.id
WHERE Articles.a_id={$a_id}
或者,要返回具有LIKE某个字符串类别的所有文章:
SELECT a_id,name,Description
FROM Articles
WHERE EXISTS( Select *
From ArticleCategories
INNER JOIN Category ON ArticleCategories.c_id=Category.id
WHERE Articles.a_id=ArticleCategories.a_id
AND Category.cat_name LIKE '%'+{$match}+'%'
)
(您可能必须调整最后一行,因为我不确定如何通过MySQL PHP传递字符串参数.)
标签:mysql,database-design,database,database-schema,junction-table 来源: https://codeday.me/bug/20190725/1533286.html