铭业智慧未来 2025-07-26 11:56 采纳率: 13.3%
浏览 19

在一个系统中,写一篇文章,是如何存储的

在一个系统中,写一篇文章,是如何存储的?

假设存放在数据库中,字段用text类型, 首先存储性能就不太好,对于读写操作,也不友好。
况且,类似于CSDN的博客,又有字体格式、段落格式、超链接、图片、表格等,直接用数据库存储,感觉难度就更高了。
个人的猜想是,用户写的文章,以.md的文件格式,存放在了文件系统,或者OSS服务器上,在数据库对应的表中有个文件路径的字段,指向该md格式的文件。对于文件的修改,采用的是云在线编辑的方式,同步修改该文件。


对于这样的一个业务,请大家描述一下自己的方案。

  • 写回答

6条回答 默认 最新

  • 檀越@新空间 2025-07-26 11:57
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    在系统中存储一篇文章,尤其是像CSDN这样的博客平台,涉及的内容复杂度较高,包括文本、格式、图片、表格、超链接等。直接使用数据库的 TEXT 类型来存储文章内容虽然可行,但在性能、扩展性、维护性等方面存在明显不足。因此,一个更合理的方案是将文章以 Markdown(.md) 文件的形式存储在文件系统或对象存储服务(如OSS、MinIO、S3 等),并在数据库中仅保存该文件的路径信息。


    一、文章存储的基本思路

    1. 文章内容以 .md 格式存储在文件系统或对象存储

    • 优点
      • 可读性强,便于版本控制(如 Git)。
      • 支持复杂的格式(如 Markdown 语法)。
      • 不受数据库字段长度限制。
    • 缺点
      • 需要额外管理文件存储和访问权限。
      • 对于大规模数据,需要考虑分布式存储方案。

    2. 数据库中只保存元数据(如标题、作者、时间、路径等)

    • 字段示例
      • id:主键
      • title:文章标题
      • author_id:作者ID
      • create_time:创建时间
      • update_time:更新时间
      • content_path:文章内容的存储路径(如 /articles/12345.md

    二、具体实现方案

    1. 文件存储方案

    ✅ 推荐方案:使用对象存储(如 OSS、MinIO、AWS S3)

    • 优势
      • 高可用、高并发、低成本。
      • 易于集成到云平台。
      • 支持 CDN 加速访问。
    • 操作流程
      • 用户编辑文章时,前端将内容以 .md 格式上传至对象存储。
      • 后端接收并保存为文件,返回文件路径。
      • 数据库记录该路径。

    📦 示例代码(Python + MinIO):

    from minio import Minio
    import os
    
    # 初始化 MinIO 客户端
    client = Minio(
        "play.min.io",
        access_key="YOUR_ACCESS_KEY",
        secret_key="YOUR_SECRET_KEY",
        secure=False
    )
    
    # 创建存储桶(如果不存在)
    if not client.bucket_exists("my-bucket"):
        client.make_bucket("my-bucket")
    
    # 上传文章内容到对象存储
    article_md = "# 这是一篇测试文章\n这是Markdown格式的内容"
    file_name = "article_12345.md"
    
    # 将文章写入本地临时文件
    with open(file_name, 'w', encoding='utf-8') as f:
        f.write(article_md)
    
    # 上传到对象存储
    client.fput_object("my-bucket", file_name, file_name)
    print(f"文件已上传至: https://play.min.io/my-bucket/{file_name}")
    
    # 删除本地文件
    os.remove(file_name)
    

    2. 数据库存储方案

    ✅ 数据表结构设计(MySQL 示例):

    CREATE TABLE articles (
        id INT AUTO_INCREMENT PRIMARY KEY,
        title VARCHAR(255) NOT NULL,
        author_id INT NOT NULL,
        create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
        update_time DATETIME ON UPDATE CURRENT_TIMESTAMP,
        content_path VARCHAR(255) NOT NULL UNIQUE,
        FOREIGN KEY (author_id) REFERENCES users(id)
    );
    

    3. 在线编辑与同步机制

    ✅ 实现方式:

    • 使用 在线 Markdown 编辑器(如 CodeMirrorQuillSimpleMDE 等)。
    • 前端实时将用户输入的 Markdown 内容上传到对象存储。
    • 后端监听文件变更,更新数据库中的 content_path 字段。

    🧠 优化建议:

    • 使用 WebSocket 或长轮询 实现多人协作编辑。
    • 使用 版本控制(如 Git)管理文章历史版本。
    • 使用 缓存(如 Redis)提升读取性能。

    三、总结:推荐方案

    | 模块 | 推荐方案 | |------|----------| | 文章内容存储 | 使用对象存储(如 MinIO、OSS)保存 .md 文件 | | 数据库存储 | 存储文章元数据(标题、作者、路径等) | | 编辑方式 | 在线 Markdown 编辑器 + 实时同步到对象存储 | | 性能优化 | 使用缓存、CDN、版本控制等技术 |


    四、常见问题及解决方案

    1. 如何处理文章格式转换?

      • 使用 Markdown 解析器(如 markdown 库)将 .md 转换为 HTML 展示。
      • 示例代码(Python):
      import markdown
      
      with open('article_12345.md', 'r', encoding='utf-8') as f:
          md_content = f.read()
      html_content = markdown.markdown(md_content)
      print(html_content)
      
    2. 如何防止文件被重复上传?

      • 在数据库中设置 content_path 为唯一索引,避免重复。
    3. 如何实现文章版本管理?

      • 在对象存储中按版本号命名文件(如 article_12345_v1.md, article_12345_v2.md)。
      • 在数据库中记录版本信息。

    五、最终架构图(简略)

    +---------------------+
    |      用户编辑界面   |
    +---------+-----------+
              |
              v
    +---------------------+
    |   Markdown 编辑器   |
    +---------+-----------+
              |
              v
    +---------------------+
    |     在线同步服务    |
    +---------+-----------+
              |
              v
    +---------------------+
    |     对象存储(OSS) |
    +---------+-----------+
              |
              v
    +---------------------+
    |     MySQL 数据库    |
    +---------+-----------+
              |
              v
    +---------------------+
    |     Web 展示页面    |
    +---------------------+
    

    如果你有具体的开发语言或平台(如 Java、Node.js、Django、Spring Boot 等),我可以提供更详细的代码实现。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月26日