最近在做毕设,遇到一个数据库存储的问题,不知该如何选择,请各位指点一二。
(楼主是一个前端,后端和数据库很多地方不太懂,如果有的地方说的不对,还请大家批评)
需求描述
与发微博这个操作类似,我就以发微博来说。
一条微博包括内容和多张图片。
数据库里,内容 就是一个字段,而微博-图片是一个一对多的关系。
在发微博上传图片的时候,我实现的流程是:
用户选择图片,点击上传
后端接收上传的图片,生成文件名后上传到云存储服务商,服务商返回处理后的信息
服务商返回的图片信息有:图片的宽高、大小等基本信息,和多个不同版本(原图,缩略图)的图片信息( Url 等)
后端将这张图片的信息存储在图片信息表里,返回前端图片的信息(包括图片 id )
前端显示上传完成,显示预览图。
用户点击发微博的时候,传给后端的数据内容中图片以 id 表示
一个例子:
POST /user/xxxx/status
data:
{
"content" : "微博内容",
"pics" : [
"picId-1",
"picId-2",
"picId-3"
],
}
而且,图片还是有顺序的。
到正题了,后端该如何存储这条微博。
方案分析
下面是我想到的几种方案
图片信息表结构:
1.新建一张微博-图片表
微博表:
微博-图片表:
优点:
结构清晰,遵循范式
可以直接使用 SQL 查询
缺点:
这种方案在查询的时候需要联合三张表来查
如果保证顺序的话,需要按照插入的时间戳排序或者增加一个字段,比如 order
2.在微博表中新增一个字段存储图片信息
微博表
2.1 pics 字段使用字符串,以分隔符隔开
比如:
pics = "picId1,picId2,picId3"
优点:
不用新建表
保证了顺序问题
缺点:
违反范式
需要先解析字符串,再查询
2.2 pics 字段使用 json 格式
比如:
pics = [picId1,picId2,picId3]
优点:
不用新建表
保证了顺序问题
相比 2.1 字符串,更优雅直观
缺点:
违反范式
需要先解析字符串,再查询
json 类型依赖特定数据库版本
请教
暂时就想到这几种方案。
请问各位这几种方案孰优孰劣,选择哪种更好一点?
还有没有更好的方案选择呢?