需要设计一个系统,允许一篇文章关联多个附件(如图片、文档、视频等)。
-- 文章表
CREATE TABLE articles (
article_id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 附件表
CREATE TABLE attachments (
attachment_id INT PRIMARY KEY AUTO_INCREMENT,
file_name VARCHAR(255) NOT NULL,
file_path VARCHAR(512) NOT NULL,
file_type VARCHAR(50),
file_size BIGINT,
uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 文章-附件关联表
CREATE TABLE article_attachments (
id INT PRIMARY KEY AUTO_INCREMENT,
article_id INT NOT NULL,
attachment_id INT NOT NULL,
sort_order INT DEFAULT 0, -- 附件排序
FOREIGN KEY (article_id) REFERENCES articles(article_id) ON DELETE CASCADE,
FOREIGN KEY (attachment_id) REFERENCES attachments(attachment_id) ON DELETE CASCADE,
UNIQUE KEY (article_id, attachment_id) -- 防止重复关联
);
CREATE TABLE articles (
article_id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
content TEXT,
attachments JSON, -- 存储附件ID数组,如[1, 3, 5]
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
attachments
表article_attachments
表中创建文章与附件的关联记录-- 获取文章及其所有附件
SELECT a.*,
GROUP_CONCAT(at.file_name) AS attachment_names,
GROUP_CONCAT(at.file_path) AS attachment_paths
FROM articles a
LEFT JOIN article_attachments aa ON a.article_id = aa.article_id
LEFT JOIN attachments at ON aa.attachment_id = at.attachment_id
WHERE a.article_id = ?
GROUP BY a.article_id;
uploads/2023/11/15/filename.ext
CREATE INDEX idx_article ON article_attachments(article_id)
这个设计方案提供了灵活的多附件关联机制,同时保持了数据库的规范化和查询效率。