素材牛VIP会员
模仿陌陌八张头像的数据库,应该如何建表才合适?
 L***灬  分类:SQL代码  人气:1195  回帖:8  发布于6年前 收藏

我想大家都已经看过我以前的问题了。就是吐槽创业好难。自己能力不足,基本上我获得的经验都是segmentfault上面一个个提问得来的。在这里,我要感谢哪些帮助过我的人,不管是多么幼稚的问题都会有人热心的回答你。
当然,我又有了新问题。就是陌陌的八张头像,陌陌在后台是如何保存的(就是如何建表的)
我的技术见解非常肤浅,但是我估计陌陌个人资料根本就不是用mysql来保存的,而用的是mongodb。

当然,图片文件肯定是存在文件系统里面的,路径肯定是保存在表里面的嘛!!
而要用mysql保存的话:

CREATE TABLE  travel_user_avatar(
  userId     INT UNSIGNED  PRIMARY KEY  NOT NULL  COMMENT ' 用户的唯一id',
  avatar0  VARCHAR(255) DEFAULT '',
  avatar1  VARCHAR(255)DEFAULT '',
  avatar2  VARCHAR(255)DEFAULT '',
  avatar3  VARCHAR(255)DEFAULT '',
   CONSTRAINT `useravatar` FOREIGN KEY (`userId`) REFERENCES `travel_user_meta` (`userId`) ON DELETE CASCADE ON UPDATE CASCADE
);

如果使用mysql,这样建表对吗?
最近做了一段时间的项目,还是发现了好多关系型数据库的不足。比如这个个人资料这一块,用非关系型数据库就要比关系型数据库要好很多啊!!

 标签:mysqlphp

讨论这个帖子(8)垃圾回帖将一律封号处理……

Lv3 码奴
ou***un JS工程师 6年前#1

方法很多:
拼接URL,八张图各个命名放在不同文件名内。不存数据库,根据会员ID或是会员名来生成文件夹保存并存图像。
在图像字段使用 格式化后的数据统一存在一个字段里。如json。

Lv6 码匠
追***忆 UI设计师 6年前#2

(本人才疏学浅,见笑)

先来说说可能的方式:

  1. 可以按照你给的方式
  2. 可以把列拆分成行 userId avatar index
  3. 可以存储Json格式 userId content -> 1,{avatars:["aaa.png","bbb.png"]}
  4. 或者用mongodb这些文档型的
  5. 把8图合并成一张存储,在客户端拆分。这样可以减少对服务器的请求次数。因为更改头像的业务比拉取头像图片远远要少得多。

现在回答你的问题:如何建表才合适?

如果产品的功能是不会再变了(8图头像),则第二条是不合适的;
接着如果用户的个人资料是包含头像一起的(每次查询个人资料的结果都会包含头像),则第四条是不合适的,因为涉及到跨越不同的数据库类型,而查询个人资料往往在社交软件中是一个频繁的操作。
如果数据库设计中avatar要和别的表关联,那么第三条是非常蛋疼的。

下面是另一种情形:
如果头像不一定由8图组成,可能是4图,可能是9图,那么按照第一条的设计方式是不行的
如果在线用户非常多,拉取头像图片非常频繁,那么第5条相比其他方式的运营成本要少


也就是说 设计可能会存在完美的设计,但是并不一定适合你当时的需求。你可能只有1000人的在线数,但是你搞分库分表读写分离,这不是蛋疼吗。
请不要过度设计!

也就是说 我以上说的都是废话。。。因为我没有回答你的问题····
你还是得按照你对业务本身的理解和对数据的预期,来选择最符合你的模式

Lv4 码徒
li***zi 其它 6年前#3

没清楚问题是什么。八张头像为啥要存在数据库里面?

Lv6 码匠
de***22 移动开发工程师 6年前#4

解决方案太多了。

1、使用关系型数据库

由于用户和头像是一对多的关系,常见的做法就是建立两张表来描述这个关系就好了。

2、在图片的文件名上做文章

在图片的文件名上用特定的关键字来标识不同的图片,要用哪张就自己拼接哪张图片的URL就好了。

Lv5 码农
ga***et 移动开发工程师 6年前#5

如果8张图片都是从一张图片裁剪来额话,原图可以上传到七牛这样的云存储,定义好要取的图片样式,使用它的图片处理取就行了。数据库只存原图的信息,图片样式可以写在配置文件中。

Lv5 码农
wz***16 技术总监 6年前#6

说一个另类的解决方案,用七牛的云存储服务,取图片的时候带上需要的尺寸会自动转换

Lv6 码匠
bi***am 技术总监 6年前#7

这种情况也不是一定要mongodb的吧。。。直接分一个user_avatar表出来,id,user_id和avatar字段就好了。。个人是偏向于大量使用mysql..只有在特定(tag、关系)之类的地方用redis..mongodb几乎不用..

Lv5 码农
zh***ao 职业无 6年前#8

我觉得你的这个头像的地址都不一定需要储存,比如所有的用户头像都在一个文件夹下面,使用uid加另外一个标志区分一下文件名就好了,每次自动拼接一下url 。比如说/avatar_1000(uid)_a1(尺寸标志).jpg,/avatar_1000(uid)_a2.jpg 就好了~

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取