视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何合理使用数据库冗余字段的方法
2020-11-09 21:16:20 责编:小采
文档


privot多对多关系的中间表。PT5框架会自动把privot带上。

我们需要隐藏,因为我们不需要privot,而且pritvot也不在我们模型本身,他是中间数据

另外冗余字段,我们有一个表是记录图片的,另一个表是记录商品的。

我们可以在图片你放商品图片里的url

同时商品里放图片id和图片URL

这两个字段是重复的,这就是数据冗余,我们设计数据库是不要出现冗余信息,为啥我们用冗余呢。

主要是为了出于对查询性能的考虑。

我们在这里做了数据冗余,我们就可以减少对图片表的查询,加速查询速度!

不过推荐大家滥用数据冗余,因为数据冗余对于数据完整性,和一致性维护很困难。有两个地方记录相同的信息,但我们去写入数据的时候,就需要写入到两个地方。最大的问题在于删除和跟新。更新的时候一个地方的IMG改变了,要更改两个。否则就会产生数据不一致。不过数据冗余用的还是挺多的。

在WEB开发中,除了掌握一些必要的数据库优化技巧外,在合适的时候使用冗余字段也可以做到事半功倍的效果。比如下面这样一个例子,有这么几个表,是这么设计的。

  • 用户表[user]:id,userName
  • 项目表[project]:id,projectName, user_id
  • 版本表[version]:id,versionName,project_id
  • 分类表[category]:id,categoryName,version_id
  • 内容表[content]:id,text,category_id
  • 差不多就是这样了。看着很不错,没有字段冗余。也符合数据库设计的三大范式。

    那我们先提个问题,命名为问题X吧。

    问题X:如果要查询某个版本下的内容列表,sql应该是这么写的:

    select c.* from content c, category t where c.category_id=t.id and t.version_id=?

    好像也没什么问题。要怎么优化这个查询呢?这个问题我们最后再来说。讲回上面的表设计,如果有这样一个问题。举个例子,我要查询内容A是否属于用户U,那我应该怎么做?

  • 查询内容A所属的分类B
  • 查询分类B所属的版本C
  • 查询版本C所属的项目D
  • 查询项目D是否属于用户U,从而得出内容A是否属于用户U
  • 这样的做法简直恶劣至极不是吗。此时你应该已深刻意识到这种表设计弱爆之处。那怎么做呢?

    冗余字段!没错,我们需要在表里添加冗余字段。如果在上述表(除了user表)都添加一个user_id字段,会怎么样呢?

    首先,可以确定,每个表的user_id字段的值都不会发生改变。所以,这个字段的值从一开始设定之后,就不用再修改了。

    然后,我们再回到上述的问题:查询内容A是否属于用户U。现在的做法是这样的:

    查询内容A的user_id是否为用户U的id

    就一步!好简单粗暴是吧!很爽快是吧!

    只需添加user_id这个冗余字段,就很大程度地方便了编码量,而且数据库的查询效率也提升N倍。还有,这个字段只需要维护一次!

    现在知道冗余字段的威力了吧,回到问题X。怎么优化那个业务逻辑呢?

    正确的做法应该是:在content表中,添加多一个version_id字段,可以肯定,这个字段跟user_id字段类似,只需要维护一次。

    然后问题X的sql改为:

    select c.* from content c where c.version_id=?

    相当简单的sql!

    以上说明,有时候,适当的数据库冗余是个不错的选择。

    总结

    下载本文
    显示全文
    专题