假设我们需要设计一个博客系统,有以下实体,文章(article),用户(user)。现在需要实现一个需求,需要记录一篇文章有哪些用户浏览了。于是,我们在article这个表增加了一列来记录用户浏览数据,假设这列叫做user_Id,由于一篇文章可能有多个用户访问。我们将这一列设计为varchar类型,并将多个用户的id用逗号来分割,假设有用户id分别为1,2,3的用户来访问,那么这列存储的是1,2,3。那么你能看出来这样设计有什么问题吗?
这样设计存在以下几个问题:
1.查询数据问题
当我们先知道用户id为1的用户浏览了哪些文章时,此时不能通过select * from article where user_id= '1'这种方式,因为这样无法过滤出所有数据。此时可以使用select * from article where user_id like '%,1,%'或者正则表达式。这种问题显而易见,使用like %无法使用索引。正则表达式使用复杂。
2.表连接问题
如果我们先查询出浏览文章的用户其他数据,需要使用article和user表来做连接。但是使用1,2,3无法直接用join on user_id=user_id。仍然要使用正则表达式,这样关联效果慢,而且复杂;
3.聚合查询问题
如果我想统计文章的浏览量,那么使用1,2,3这种数据计算复杂。远不是select count(*)可以解决;
4.更新数据问题
如果article表的一条记录需要增加一个浏览者的id,那么SQL需要累加上去,