数据库一对多设计表问题,一个用户对应多条数据,怎么存

csny2014 2015-07-02 11:51:29
比如两个表,一个用户表,一个图片表,图片表有一个用户id字段记录此条数据属于哪个用户,一个用户有 n 张图片。当我想选出某个用户的所有图片,可以用图片表的用户id字段来筛选,但是这样存在一个性能问题,每次都要筛选,而且有时候不一定需要全部数据,可能选出隔一张一个图片,这一点sql语句很难写。

如果在用户表建立一个imagelist字段,存储他所有图片的id,这样,读取用户的时候,就已经获得了图片id列表,怎么操作都很方便,但是这样曾删图片的时候,就还需要操作用户表,增加了出错的几率和程序的复杂度。


这种一对多的情况,表应该怎么设计,请高手说说。
...全文
5239 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
道玄希言 2015-07-03
  • 打赏
  • 举报
回复
你第二种设计, 首先就不能满足关系数据库设计的第一范式. 关系数据库的每一列都应该是原子级的. 还有, 將多序号放入同一列, 查询语句并没有被简化, 需要对字段进行拆分匹配, 才能查出对应的图片纪录. 特别是你说的, 如果需要隔一张选出一个图片, 这將比直接的条件查询更加麻烦... 还有你自己说的, 更新,删除部分图片时, 你需要先查询出用户有哪些图片, 然后, 再重新更新或者删除序号, 再重新合并序号, 更新到数据库,先不说这些操作有可能带来的异常, 其效率也没有对关系表单独的修改, 删除一条纪录快吧. 还有, 扩展 性 能, 当用户对应的图片很多时, 比如1000张,甚至跟多时, 怎么处理? 而且, 你又不是需要一次性的將所有用户和对应的图片都取出来, 而是需要按照用户名来查询, 这样在千万级别的表中, 都是每啥问题的. 再多到亿级,千亿级别的数据, 也可以建分区表来保存用户--图片纪录.
csny2014 2015-07-03
  • 打赏
  • 举报
回复
楼上的方法就是我说的第一种方法,在关系比较简单的情况下,可以省去用户-图片关系表,就在图片表里直接记录用户id。 但是,这种方法虽然符合规范,肯定存在性能问题,当然,大多数情况下,性能也够,但是第二种方法有什么不好呢?
csny2014 2015-07-03
  • 打赏
  • 举报
回复
首先,如果关系型数据库就是一切,就不会有那么多非关系型数据库了,而很多时候,我们即使使用关系型数据库,也不是所有信息都需要关系型数据库的功能。 很多时候,我们就是存个信息,我这个字段就不是原子的,因为它存取更新都是一组一组同时的。很多时候,这样无论是程序设计还是数据库的性能都更好。事实上,我某些字段存储的就是json,需要数据的时候,这组数据json解码,一下子就得到所有数据了。 比如我说的这个图像数组,我客户端可能一下子删除了n个图像,我只要把剩下的图像id,存进去就行了,不需要读取这个字段,因为一切以客户端为准。当然,这需要更新两个表,一个是删除图像表的图像数据,一个是更新用户表的图像列表字段,如果不加验证,图像删除可能不成功,但是列表更新成功,不过这种所谓的删除不成功,无论如果都可能存在,与数据库结构没有关系。
道玄希言 2015-07-02
  • 打赏
  • 举报
回复
用户表 用户ID(主键), 用户名称...... 图片表 图片ID(主键), 图片名称, 图片保存位置.... 用户-- 图片关系表 用户ID, 图片ID (用户ID和图片ID建联合主键), 序号(图片在该用户的显示顺序).... 取图片如: 隔行取图片(取偶数行): SELECT A.图片ID, B.图片名称, ...... FROM 用户-- 图片关系表 A INNER JOIN 图片表 B ON A.图片ID = B.图片ID WHERE A.用户ID = '用户编号' and (A.序号)%2 = 0

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧