首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

雲筆記系統設計指南:數據庫表結構與存儲方案選型

     編輯:程式設計疑難解答

系統定位

畢業設計級雲筆記,Web 端,核心功能:用戶管理、筆記增刪改查、分類標籤、圖片附件、多端同步。

核心數據庫表設計

1. 用戶表


CREATE TABLE `user` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL UNIQUE,
  `password_hash` VARCHAR(100) NOT NULL,
  `email` VARCHAR(100) UNIQUE,
  `avatar_url` VARCHAR(255),
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

2. 筆記本/分類表


CREATE TABLE `notebook` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `user_id` BIGINT NOT NULL,
  `name` VARCHAR(100) NOT NULL,
  `icon` VARCHAR(50),
  `sort_order` INT DEFAULT 0,
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `user`(`id`)
);

3. 筆記主表


CREATE TABLE `note` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `user_id` BIGINT NOT NULL,
  `notebook_id` BIGINT,
  `title` VARCHAR(200) NOT NULL,
  `content` LONGTEXT, -- 純文本/Markdown/HTML
  `content_type` ENUM('markdown','html','text') DEFAULT 'markdown',
  `is_deleted` TINYINT DEFAULT 0,
  `is_favorite` TINYINT DEFAULT 0,
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `user`(`id`),
  FOREIGN KEY (`notebook_id`) REFERENCES `notebook`(`id`),
  INDEX `idx_user_updated` (`user_id`, `updated_at`)
);

4. 標籤表(多對多)


CREATE TABLE `tag` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `user_id` BIGINT NOT NULL,
  `name` VARCHAR(50) NOT NULL,
  UNIQUE KEY `uk_user_name` (`user_id`, `name`)
);

CREATE TABLE `note_tag` (
  `note_id` BIGINT NOT NULL,
  `tag_id` BIGINT NOT NULL,
  PRIMARY KEY (`note_id`, `tag_id`),
  FOREIGN KEY (`note_id`) REFERENCES `note`(`id`) ON DELETE CASCADE,
  FOREIGN KEY (`tag_id`) REFERENCES `tag`(`id`) ON DELETE CASCADE
);

5. 圖片/附件表


CREATE TABLE `attachment` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `note_id` BIGINT NOT NULL,
  `file_name` VARCHAR(255),
  `file_path` VARCHAR(500), -- OSS 路徑或相對路徑
  `file_size` BIGINT,
  `mime_type` VARCHAR(100),
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`note_id`) REFERENCES `note`(`id`) ON DELETE CASCADE
);

存儲方案選型:數據庫 vs 文件系統 vs 對象存儲

方案優點缺點適用場景
數據庫 BLOB/TEXT事務一致性、備份簡單、無需額外組件大對象膨脹備份/恢復慢、連接池壓力大、不利於 CDN 分發小型項目、文本為主、附件極少
服務器本地文件系統讀寫性能高、無網絡開銷單點故障、擴展困難、多機部署需共享存儲 (NFS/GlusterFS)單機部署、附件較大
對象存儲 (OSS/S3/MinIO)無限擴展、高可用、CDN 加速、簽名直傳減輕服務器引入外部依賴、最終一致性、成本隨量增長生產環境、多端同步、圖片/文件較多

推薦架構(畢業設計可簡化版)

  1. 文本內容:直接存 MySQL LONGTEXT(Markdown/HTML),支持全文檢索。
  2. 圖片/附件:上傳至 MinIO (本地部署 S3 兼容) 或騰訊云/阿里云 OSS,數據庫存 file_path (如 bucket/notes/user123/abc.png)。
  3. 緩存層:Redis 緩存熱門筆記、用戶會話、標籤統計。
  4. 搜索:Elasticsearch 同步筆記標題/內容,提供全文搜索。

參考資源

  • 《有道雲筆記架構設計》—— 了解大規模同步衝突解決、增量同步協議。
  • 達內雲筆記源碼—— 適合快速上手項目結構。
  • 《Web 應用架構設計》—— 基礎分層、緩存、隊列、分庫分表原理。

核心知識點清單

  1. RESTful API 設計、JWT 鑒權、刷新 Token 機制。
  2. Markdown 解析渲染(前端 marked.js / 後端 commonmark)。
  3. 圖片上傳:預簽名直傳 OSS、Base64 回填編輯器。
  4. 樂觀鎖/版本號解決多端編輯衝突。
  5. 定時任務:軟刪除清理、統計報表、全量同步觸發。

畢業設計以 MySQL + MinIO + Redis 搭建核心存儲棧,實現筆記 CRUD、分類標籤、圖片上傳、關鍵字搜索,代碼結構清晰、文檔完善,足以應對答辯與展示。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved