询问一个 Mysql 数据库一对多关系的存储方式问题

2019-05-03 03:28:37 +08:00
 zhengjian

最近在做毕设,遇到一个数据库存储的问题,不知该如何选择,请各位指点一二。

(楼主是一个前端,后端和数据库很多地方不太懂,如果有的地方说的不对,还请大家批评)

需求描述

与发微博这个操作类似,我就以发微博来说。

一条微博包括内容多张图片

数据库里,内容 就是一个字段,而微博-图片是一个一对多的关系。

在发微博上传图片的时候,我实现的流程是:

  1. 用户选择图片,点击上传
  2. 后端接收上传的图片,生成文件名后上传到云存储服务商,服务商返回处理后的信息
  3. 服务商返回的图片信息有:图片的宽高、大小等基本信息,和多个不同版本(原图,缩略图)的图片信息( Url 等)
  4. 后端将这张图片的信息存储在图片信息表里,返回前端图片的信息(包括图片 id )
  5. 前端显示上传完成,显示预览图。
  6. 用户点击发微博的时候,传给后端的数据内容中图片以 id 表示

一个例子:

POST  /user/xxxx/status

data: 

{
    "content" : "微博内容",
    "pics" : [
        "picId-1",
        "picId-2",
        "picId-3"
    ],
}

而且,图片还是有顺序的。

到正题了,后端该如何存储这条微博。

方案分析

下面是我想到的几种方案

图片信息表结构:

1.新建一张微博-图片表

微博表:

微博-图片表:

优点:

  1. 结构清晰,遵循范式
  2. 可以直接使用 SQL 查询

缺点:

  1. 这种方案在查询的时候需要联合三张表来查
  2. 如果保证顺序的话,需要按照插入的时间戳排序或者增加一个字段,比如 order

2.在微博表中新增一个字段存储图片信息

微博表

2.1 pics 字段使用字符串,以分隔符隔开

比如:

pics = "picId1,picId2,picId3"
优点:
  1. 不用新建表
  2. 保证了顺序问题
缺点:
  1. 违反范式
  2. 需要先解析字符串,再查询

2.2 pics 字段使用 json 格式

比如:

pics = [picId1,picId2,picId3]
优点:
  1. 不用新建表
  2. 保证了顺序问题
  3. 相比 2.1 字符串,更优雅直观
缺点:
  1. 违反范式
  2. 需要先解析字符串,再查询
  3. json 类型依赖特定数据库版本

请教

暂时就想到这几种方案。

请问各位这几种方案孰优孰劣,选择哪种更好一点?

还有没有更好的方案选择呢?

3603 次点击
所在节点    数据库
22 条回复
autogen
2019-05-04 00:43:55 +08:00
图片顺序,图片表加个 order 字段
zhengjian
2019-05-04 01:15:06 +08:00
@autogen #21 感谢详细讲解。这样的话是标准的一对多关系。当上传来图片的时候在图片表插入一条记录,weibo_id , order 设为 null,发布微博的时候再批量修改这几条图片记录的 weibo_id 和 order。新发布的时候逻辑很清晰。

当修改的时候,对比当前图片数组与新的图片数组,需要分几种情况:
1. 顺序变,更改 order
2. 有增加,将 weibo_id 插入增加的那张图片的记录,并重新修改 order
3. 有删除,将删除的图片那条记录 weibo_id 设为 null 或删除这条记录,并重新修改 order

这样修改的时候,操作会比较复杂一点。

希望我没理解错误。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/560631

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX