无法到达的快递地址 一次偷懒表设计带来的惨痛教训

  前段时间,商城在做促销活动的时候,我们的测试人员也买了一些商品,但是时隔多天一直没有收到快递,很是纳闷。经过开发同学的确认,该订单的邮递地址为:北京市火星区xxx,电话号码15555555555,这显然不是一个合理的邮寄地址。由于之前确认过线上并不存在SQL注入的可能性,因此只可能是线上的正常流程影响了订单的邮寄地址。在Check线上流程的时候,发现一个巨大的bug,这个bug看似平淡无奇,但实际上影响范围很大。

  这里我们简单说一下,商城建立的初期,只有添加用户常用地址的功能,并没有删除和更改地址的功能,也就是说,地址一旦被添加后,则这个地址的id、地址信息都是只读的、不变的,因而当时为了节约空间,之间在订单中引用了用户地址的id号,作为用户提交订单时地址的快照,也就是说,数据库表是这样的结构:

  问题就出在这里!

  随着商城的优化,产品MM觉得对于用户的常用地址,编辑和删除应该是正常的操作,而由于中间隔了大约一个月的时间,因此在添加此功能的时候,完全忘记了用户的订单是使用的是用户地址的id来关联的,这时就带来一个很大的问题:用户可能一时糊涂(或者新奇),把自己的地址改成一个并不存在的地址,这样实际上也就隐式的修改了订单的地址!这样的设计,当然是错误的。

  知道了原因,也就知道了解决方案:那就是在生成订单的时候,并不是简单的保存地址的id,而应该记录当时地址的快照信息。为了尽量减少订单表的大小,专门抽出一个单独的表order_addr记录订单的地址信息。这样在查找订单信息时,不必要的地址信息不会拖慢整个订单表查询,而在需要查找地址信息时,只需简单的join查询即可。

  现在的表实际上是这样的关联关系:

这样修改过后,用户对常用地址的修改,删除等都不会影响订单的状态了。

有时候看似很简单的问题,可能有着很多潜在的陷阱,这个问题也警示我们:越是简单的问题,越不能掉以轻心,全方位思考应该是我们做任何事情应该养成的良好习惯。

时间: 2024-11-07 19:57:46

无法到达的快递地址 一次偷懒表设计带来的惨痛教训的相关文章

数据结构与算法系列研究八——链地址法建哈希表

链地址法建哈希表 一.实验内容    建立n元关键字哈希表,用链地址法解决冲突,输出建立的哈希表.(按链表的顺序),输入任意元素实现查找查找结果分成功和失败,要求查找时可以反复输入关键字查找,直至输入停止标识符时程序结束. 二.输入与输出  输入:可以用随机数法产生n元关键字,然后,产生哈希表,输入要查找的关键字判断是否存在.  输出:输出哈希表,输出查找的结果.三.关键数据结构和核心算法  关键数据结构:     链式哈希表由一组数组作为"头指针",每个数组之后都有一个链表,该链表中

智能识别快递地址api接口实现(PHP示例)

电商.ERP等行业发货时,批量录入图片上的收件人地址是个难题:智能识别收件人API是近乎完美的解决方案,通过识别图片,解析出图片中收件人的姓名.电话.详细地址(省.市.区/县.详细地址).将此接口集成到下单环节,可极大的提高了发货效率. 一.使用场景 场景1:客户微信(或QQ.钉钉等)截图收件人信息及地址 场景2:快递单上面的收件人信息及地址 场景3:手写收件人信息及地址 二.智能识别收件人服务使用流程 1.注册快宝开放平台,获取开发者账号,并认证资质:http://open.kuaidihel

阶段一-03.地址,订单,支付,定时任务开发-第1章 收货地址功能开发-1-1 收货地址 - 需求分析与表设计

结算页面让用户确认信息,选择收货地址 还需要开发的是整理的收货地址 生产环境上的效果 默认选中的地址 新增一个测试的地址 这就是新增的地址 用户初次进入到订单结算页面,默认选中的是默认地址 和地址相关的数据库 省市区,都是在js里面进行维护的 其实就是一个json的数组,包含了很多的内容. 创建conroller AddressController 结束 原文地址:https://www.cnblogs.com/wangjunwei/p/12359446.html

上周热点回顾(11.24-11.30)

热点随笔: · 我是如何在SQLServer中处理每天四亿三千万记录的(马非码)· VS2015 Apache Cordova第一个Android和IOS应用(aehyok)· 薪资至少10K的一道题,你能拿下吗(小尧弟)· VS2015 ASP.NET5 Web项目结构浅析(aehyok)· 充满想象力的 JavaScript 物理和重力实验(梦想天空(山边小溪))· 用于新浪微博,腾讯QQ,淘宝 OAuth2.0 登陆的NET类库封装(天真的好蓝啊)· 无法到达的快递地址 一次偷懒表设计带来

三大范式

分析: 数据库设计应遵循三大范式分别为: 第一范式:确保表中每列的原子性(不可拆分): 第二范式:确保表中每列与主键相关,而不能只与主键的某部分相关(主要针对联合主键),主键列与非主键列遵循完全函数依赖关系(完全依赖): 第三范式:非主键列之间没有传递函数依赖关系(消除传递依赖): 详述: 第一范式 需求描述:数据库系统中需要一个实体表,该表用来存储用户信息,其中"地址"这个属性,要求查询到省份.城市和详细地址. 例子:信息如下: 姓名:张红欣:性别:男:  年龄:26岁:年龄:26岁

sqlserver 三大范式

sqlserver 三大范式 SqlServer之数据库三大范式 分析: 数据库设计应遵循三大范式分别为: 第一范式:确保表中每列的原子性(不可拆分): 第二范式:确保表中每列与主键相关,而不能只与主键的某部分相关(主要针对联合主键),主键列与非主键列遵循完全函数依赖关系(完全依赖): 第三范式:非主键列之间没有传递函数依赖关系(消除传递依赖): 详述: 第一范式 需求描述:数据库系统中需要一个实体表,该表用来存储用户信息,其中"地址"这个属性,要求查询到省份.城市和详细地址. 例子:

第五章 SqlServer之数据库三大范式

分析: 数据库设计应遵循三大范式分别为: 第一范式:确保表中每列的原子性(不可拆分): 第二范式:确保表中每列与主键相关,而不能只与主键的某部分相关(主要针对联合主键),主键列与非主键列遵循完全函数依赖关系(完全依赖): 第三范式:非主键列之间没有传递函数依赖关系(消除传递依赖): 详述: 第一范式 需求描述:数据库系统中需要一个实体表,该表用来存储用户信息,其中"地址"这个属性,要求查询到省份.城市和详细地址. 例子:信息如下: 姓名:张红欣:性别:男:  年龄:26岁:年龄:26岁

MySQL 表的一对一、一对多、多对多问题

将实体与实体的关系,反应到最终数据库表的设计上,将关系分为三种:一对一,一对多(多对一)和多对多,所有的关系都是表与表之间的关系; 一对一 一对一:一张表的一条记录只能与另外一条记录进行对应,反之亦然学生表:姓名,性别,年龄,体重,身高,婚姻状况,籍贯,家庭地址,紧急联系人 Id(P) 姓名 性别 年龄 身高 婚姻状况 籍贯 家庭地址 紧急联系人 体重 表设计成以上这种形式:符合要求,其中姓名,性别,年龄,身高体重属于常用数据,但是婚姻籍贯住址联系人属于不常用的数据,如果每次查询所有数据,不常用

8Manage:物流CRM,深度挖掘快递企业下一站蓝海!

[导读]网购的普及加快了快递物流服务在中国的发展,而物流行业也开始展露出自身巨大的发展潜力和进步空间.其中,作为物流行业根本核心的物流客户关系管理开始引起了管理者的注意,如何升级用户物流服务体验,把握客户,深度挖掘客户的物流需求,成为了快递企业下一步发展的关注点. 双11快递长蘑菇.奇葩的快递地址等等热词频繁登上热搜,这表明快递物流开始逐渐成为目前社会关注的热点.随着中国经济的不断发展,网购的不断普及与深入,消费的升级转型,快递业的配送也成为了用户购物的考虑标准,而其中的用户升级服务也成为了各大