一个糟糕的表设计

修改过一个比较糟糕的表设计,整个表没有主键,没有唯一字段,还存在存合同的大字段。

估计是上线时表结构已经定型,没有整合DBA的意见。但随着业务量的增长,原表的设计已经不能满足业务需求。所以开发又主动要求DBA配合修改表结构。

面对这样一张表,首先第一步,需要给表添加无意义自增主键。

给表添加int型主键ID

给已有的记录设置ID值:

因为这个表里面有大字段。以至于这个表非常大,因为服务器参数限制,修改报错。于是按记录分布情况分批操作:

+--------------------------------+----------+
| DATE_FORMAT(UPDATED_AT,‘%Y%m‘) | count(*) |
+--------------------------------+----------+
| 201604 | 10 |
| 201605 | 146 |
| 201606 | 441 |
| 201607 | 505 |
| 201608 | 1317 |
| 201609 | 14485 |
| 201610 | 17110 |
| 201611 | 35426 |
| 201612 | 29740 |
+--------------------------------+----------+

set @rownum = 0;
UPDATE tt a SET a.ID = (@rownum:[email protected]+1) where DATE_FORMAT(UPDATED_AT,‘%Y%m‘)=‘201604‘;
set @rownum = 100;
UPDATE tt a SET a.ID = (@rownum:[email protected]+1) where DATE_FORMAT(UPDATED_AT,‘%Y%m‘)=‘201605‘;
set @rownum = 300;
UPDATE tt a SET a.ID = (@rownum:[email protected]+1) where DATE_FORMAT(UPDATED_AT,‘%Y%m‘)=‘201606‘;
set @rownum = 1000;
UPDATE tt a SET a.ID = (@rownum:[email protected]+1) where DATE_FORMAT(UPDATED_AT,‘%Y%m‘)=‘201607‘;
set @rownum = 1600;
UPDATE tt a SET a.ID = (@rownum:[email protected]+1) where DATE_FORMAT(UPDATED_AT,‘%Y%m‘)=‘201608‘;
set @rownum = 3000;
UPDATE tt a SET a.ID = (@rownum:[email protected]+1) where DATE_FORMAT(UPDATED_AT,‘%Y%m‘)=‘201609‘;
set @rownum = 20000;
UPDATE tt a SET a.ID = (@rownum:[email protected]+1) where DATE_FORMAT(UPDATED_AT,‘%Y%m‘)=‘201610‘;
set @rownum = 40000;

UPDATE tt a SET a.ID = (@rownum:[email protected]+1) where DATE_FORMAT(UPDATED_AT,‘%Y%m‘)=‘201611‘;

set @rownum = 80000;
UPDATE tt a SET a.ID = (@rownum:[email protected]+1) where DATE_FORMAT(UPDATED_AT,‘%Y%m‘)=‘201612‘;

SELECT COUNT(*) FROM tt a WHERE a.ID IS NULL;
0
SELECT a.ID,COUNT(*) FROM tt a GROUP BY a.ID HAVING COUNT(*)>1;
0
select id,updated_at from tt where id in(
SELECT a.ID FROM tt a GROUP BY a.ID HAVING COUNT(*)>1);

set @rownum = 110000;
UPDATE tt a SET a.ID = (@rownum:[email protected]+1) where a.ID IS NULL;

ALTER TABLE tt MODIFY COLUMN ID bigint(20) NOT NULL PRIMARY KEY  AUTO_INCREMENT COMMENT ‘主键‘;ALTER TABLE tt AUTO_INCREMENT=120000;

感悟就是 :

1、关于大字段,要么存成文件的形式,要么单独存一张表,不要和其它字段和在一起。这样的话会导致任何对该表的操作都会牵一发而动全身。

2、表一定要有主键;

时间: 2024-10-11 07:43:21

一个糟糕的表设计的相关文章

JavaScript网站设计实践(七)编写最后一个页面 改进表单

原文:JavaScript网站设计实践(七)编写最后一个页面 改进表单 一.最后一个页面 contact.html.改进表单 在该页面实现的功能: 几乎所有的网站都会有表单填写,对于用户输入和填写的数据,首先我们一般现在前台验证,然后再去后台验证. 在前台最简单的验证:检查必填字段是否填写.填写格式是否符合要求等. 每个表单里面,当获取到输入焦点时,令提示文本消失 现在开始动手来写. 1.实现思路 (1)在这个表单里会验证的是必填字段和邮箱格式是否正确.首先,把判断必填字段和邮箱格式分别写在两个

HBase概念学习(八)开发一个类twitter系统之表设计

这边文章先将可能的需求分析一下,设计出HBase表,下一步再开始编写客户端代码. TwiBase系统 1.背景 为了加深HBase基本概念的学习,参考HBase实战这本书实际动手做了这个例子. 2.需求 这是一个用户推特系统,用户登陆到系统,需要维护用户的基本信息,然后用户可以发帖和其他用户进行互动.用户之间可以相互关注,用户可以浏览关注用户的推文等等. 这是一个比较简单的推特系统,不考虑用户之间的私信,用户评论推特等功能. 3.概要设计 3.1表设计 首先需要设计三个表:用户表,推特表以及用户

非常好用的一个表设计工具(EZDML)

表结构设计器(EZDML) 官网:http://www.ezdml.com/ 这是一个数据库建表的小软件,可快速的进行数据库表结构设计,建立数据模型.类似大家常用的数据库建模工具如PowerDesigner.ERWIN.ER-Studio和Rational-Rose等的超级精简版. 包含功能:1. 表结构设计:创建表.字段.主键.外键.索引和注释:2. 表描述:可直接编辑文字描述快速生成表结构,爱用键盘的人会喜欢这个功能:3. 模型图:自动生成模型图:可设计和显示物理/逻辑视图,支持自动布局.平

hbase表设计优化原则 ***** 生产环境中使用小结

2019/2/28 星期四 hbase表设计优化原则 https://www.cnblogs.com/qingyunzong/p/8696962.html表设计1.列簇设计 追求的原则是:在合理范围内能尽量少的减少列簇就尽量减少列簇. 最优设计是:将所有相关性很强的 key-value 都放在同一个列簇下,这样既能做到查询效率 最高,也能保持尽可能少的访问不同的磁盘文件. 以用户信息为例,可以将必须的基本信息存放在一个列族,而一些附加的额外信息可以放在 另一列族.2.RowKey 设计 HBas

MySQL的多表设计

一.外键约束 保证数据的完整性. 定义外键约束: 可以直接在create语句中定义外键 foreign key 当前表名(字段名) references 目标表名(目标表的主键) 创建完语句后,可以直接使用修改语句定义 alter table 表名 add foreign key 当前表名 (字段名) references 目标表名(目标表的主键) 二.多表设计的三种实体关系 多对多.一对多和一对一 三.多表设计之---------一对多 一个班级可以有多个学生,但是一个学生只能属于一个班级.或

php不用递归完成无限分类,从表设计入手完整演示过程

无限分类是什么就不废话了,可以用递归实现,但是递归从数据库取东西用递归效率偏低,如果从表设计入手,就很容易做到网站导航的实现,下面是某论坛导航,如下图 网上无限分类大多不全面,今天我会从设计表开始, 首先我们先做视图界面, <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>白超华-博客园</title> &

mysql中的索引原理与表设计

索引是有效使用数据库的基础,但你的数据量很小的时候,或许通过扫描整表来存取数据的性能还能接受,但当数据量极大时,当访问量极大时,就一定需要通过索引的辅助才能有效地存取数据.一般索引建立的好坏是性能好坏的成功关键. 1.InnoDb数据与索引存储细节 使用InnoDb作为数据引擎的Mysql和有聚集索引的SqlServer的数据存储结构有点类似,虽然在物理层面,他们都存储在Page上,但在逻辑上面,我们可以把数据分为三块:数据区域,索引区域,主键区域,他们通过主键的值作为关联,配合工作.默认配置下

数据库表设计五大范式所解决的问题

上学时学得<数据库系统概念>,一致似懂非懂,停留在定义和证明层面.最近在做项目,认真的了解了下数据库的范式问题,只有潜意识懂得了其原理和应用场合才能较快设计出合理的表. 首先,明确概念如下: 主码 也就是主键 候选码 若关系中的某一属性组的值能唯一的标识一个元组,而其任何真子集都不能再标识,则称该属性组为候选码.候选码不唯一,主码是其中一个而已. 主属性 包含在任一候选关键字中的属性称主属性 其次,也是本文重头戏,结合例子,讲一下各大范式对前者的改进和应用场景. 范式在现实中解决的问题 1.数

20170105数据库表设计知识点

20170105数据库表设计知识点 ------指导老师    星哥 1.PHP(MYSQL)擅长单表操作,不要做过多无谓的连接查询 2.表字段名不要使用大驼峰命名方式,最好采用下划线,命名要和团队习惯一致,通俗易懂. 3.表级.字段都要有注释 4.MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好.甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成.另外,MyISAM 对于 SELECT COUNT(*) 这类的计算