如何合理使用数据库冗余字段的方法

作者:CODETC 时间:2024-01-18 16:52:00 

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!

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

来源:http://www.codetc.com/article-66-1.html

标签:数据库,冗余字段
0
投稿

猜你喜欢

  • ASP调用数据库常见错误的解决

    2007-09-07 10:05:00
  • 让程序员都费解的10大编程语言特性

    2023-09-12 03:56:49
  • 详解django2中关于时间处理策略

    2021-09-09 23:13:09
  • 详解Python调试神器之PySnooper

    2021-05-20 06:51:12
  • python yield迭代器详解

    2023-12-06 09:36:50
  • Python Pandas聚合函数的应用示例

    2022-12-13 22:39:31
  • iframe的防插与强插

    2009-03-03 12:33:00
  • python beautiful soup库入门安装教程

    2023-03-04 06:24:27
  • Pycharm生成可执行文件.exe的实现方法

    2023-07-19 12:09:54
  • python将字符串list写入excel和txt的实例

    2022-02-28 05:07:01
  • Oracle 随机数

    2024-01-16 10:46:14
  • Python如何在循环内使用list.remove()

    2023-06-07 09:11:33
  • Python实现我的世界小游戏源代码

    2023-07-26 02:09:08
  • Yii框架引用插件和ckeditor中body与P标签去除的方法

    2024-05-11 09:25:19
  • 对Python3+gdal 读取tiff格式数据的实例讲解

    2023-03-10 10:21:53
  • mysql 重启方法(初学者)

    2010-12-03 16:40:00
  • asp.net下降文本格式数据导入到数据库中的代码

    2024-01-21 16:13:04
  • 13个你希望早点知道的实用WordPress SQL查询语句[译]

    2010-02-28 12:48:00
  • 分析解决Python中sqlalchemy数据库连接池QueuePool异常

    2024-01-16 12:18:19
  • 在Django下测试与调试REST API的方法详解

    2023-05-19 16:09:32
  • asp之家 网络编程 m.aspxhome.com