数据库基础DDL

一、字段属性

合适的字段类型对于高性能来说非常重要,基本原则如下:简单的类型占用资源更少;在可以正确存储数据的情况下,选最小的数据类型。

1、数据类型选择

  • 整数类型

TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,根据数据类型范围合理选择即可。

  • 实数类型

FLOAT、DOUBLE、DECIMAL,建议资金货币相关类型使用高精度DECIMAL存储,或者把数据成倍扩大为整数,采用BIGINT存储,不过处理相对麻烦。

  • 字符类型

CHAR、VARCHAR,长度不确定建议采用VARCHAR存储,不过VARCHAR类型需要额外开销记录字符串长度。CHAR适合存储短字符,或者定长字符串,例如MD5的加密结构。

  • 时间类型

DATETIME、TIMESTAMP,DATETIME保存大范围的值,精度秒。TIMESTAMP以时间戳的格式,范围相对较小,效率也相对较高,所以通常情况建议使用。

MySQL的字段类型有很多种,可以根据数据特性选择合适的,这里只描述常见的几种类型。

2、基础用法操作

  • 数据类型

2.1 修改字段名称:

sqlserver:

alter table T_TEST_ANALYTE rename column NOREP to REPEATNO;

alter table T_TEST_RESULT rename column NOREP to REPEATNO;

oracle:

alter table T_TEST_ANALYTE rename column NOREP to REPEATNO;

alter table T_TEST_RESULT rename column NOREP to REPEATNO;

mysql:

ALTER TABLE T_TEST_ANALYTE CHANGE NOREP REPEATNO VARCHAR(36) DEFAULT NULL COMMENT '重复样';

ALTER TABLE T_TEST_RESULT CHANGE NOREP REPEATNO VARCHAR(36) DEFAULT NULL COMMENT '重复样';


 

2.2 修改字段类型:

sqlserver:

ALTER TABLE T_TEST_RUN ALTER COLUMN FULLNAME varchar(120);

ALTER TABLE T_TEST_RUN ALTER COLUMN CHECKFULLNAME varchar(120);

mysql:  

alter table T_TEST_RUN modify column FULLNAME varchar(120) DEFAULT NULL COMMENT '检验人';      

alter table T_TEST_RUN modify column CHECKFULLNAME varchar(120) DEFAULT NULL COMMENT '复核人';

Oracle:

alter table T_TEST_RUN modify (FULLNAME varchar2(120));

alter table T_TEST_RUN modify (CHECKFULLNAME varchar2(120));    

2.3 新增字段:

sqlserver:

alter table T_TEST_RESULT add slope VARCHAR(36) NULL;

EXEC sys.sp_addextendedproperty @name=N'MS_Description',@value=N'斜率' ,

@level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'T_TEST_RESULT',

@level2type=N'COLUMN',@level2name=N'slope';

mysql:

ALTER TABLE t_lims_run_preprocessinfo ADD COLUMN `TESTID` bigint(20) 
DEFAULT NULL COMMENT '测试' AFTER `ORDTASKID`;

ALTER TABLE T_LIMS_CULTUREMEDIUM_INVENTORY ADD COLUMN `invoiceNo` VARCHAR(66) 
DEFAULT NULL COMMENT '库存编号' AFTER `parentId`;

oracle:


alter table t_lims_run_preprocessinfo add (METHODRELATEDID NUMBER NULL);

COMMENT ON COLUMN t_lims_run_preprocessinfo.METHODRELATEDID IS '检验项目关联方法ID';

alter table T_LIMS_CULTUREMEDIUM_INVENTORY add (invoiceNo VARCHAR2(66) NULL);

COMMENT ON COLUMN T_LIMS_CULTUREMEDIUM_INVENTORY.invoiceNo IS '库存编号';

2.4 索引:

      索引类型:主键索引,普通索引,唯一索引,组合索引,全文索引。这里演示普通索引的操作。MySQL的核心模块,后续详说。

添加索引

ALTER TABLE ms_user_wallet ADD INDEX user_id_index(user_id) ;
CREATE INDEX state_index ON ms_user_wallet(state) ;

查看索引

SHOW INDEX FROM ms_user_wallet;

删除索引

DROP INDEX state_index ON ms_user_wallet ;

修改索引

不具有真正意义上的修改,可以把原有的索引删除之后,再次添加索引。

  • 外键关联

用处:外键关联的作用保证多个数据表的数据一致性和完整性,建表时先有主表,后有从表;删除数据表,需要先删从表,再删主表。复杂场景不建议使用,实际开发中用的也不多。

添加外键

ALTER TABLE ms_user_wallet 
ADD CONSTRAINT user_id_out_key FOREIGN KEY(user_id) REFERENCES ms_user_center(id) ;

删除外键

ALTER TABLE ms_user_wallet DROP FOREIGN KEY user_id_out_key ;

2.5:  表结构管理

1、查看结构

DESC ms_user_status ;
SHOW CREATE TABLE ms_user_status ;

2、字段结构

  • 添加字段

ALTER TABLE ms_user_status 
ADD `delete_time` datetime DEFAULT NULL COMMENT '删除时间' ;
  • 删除字段

ALTER TABLE ms_user_status DROP COLUMN delete_time ;

3、修改表名

ALTER TABLE ms_user_center RENAME ms_user_info ;

4、存储引擎

  • 存储引擎

SELECT VERSION() ; SHOW ENGINES ;

MySQL 5.6 支持的存储引擎有InnoDB、MyISAM、Memory、Archive、CSV、BLACKHOLE等。一般默认使用InnoDB,支持事务管理。

  • 修改引擎

数据量大的场景下,存储引擎修改是一个难度极大的操作,容易会导致表的特性变动,引起各种后续反应。

ALTER TABLE ms_user_sso ENGINE = MyISAM ;

5、修改编码

表字符集默认使用utf8,通用,无乱码风险,汉字3字节,英文1字节,utf8mb4是utf8的超集,有存储4字节例如表情符号时使用。

  • 查看编码

SHOW VARIABLES LIKE 'character%';
  • 修改编码

ALTER TABLE ms_user_sso DEFAULT CHARACTER SET utf8mb4;

2.6: 数据管理

2.6.1:增删改查

添加数据

INSERT INTO ms_user_sso (
    user_id,sso_id,sso_code,create_time,update_time,login_ip,state
)
VALUES
    (
        '1','SSO7637267','SSO78631273612',
        '2019-12-24 11:56:57','2019-12-24 11:57:01','127.0.0.1','1'
    );

更新数据

UPDATE ms_user_sso SET 
 user_id = '1',sso_id = 'SSO20191224',sso_code = 'SSO20191224',
 create_time = '2019-11-24 11:56:57',update_time = '2019-11-24 11:57:01',
 login_ip = '127.0.0.1',state = '1'
WHERE user_id = '1';

查询数据

一般情况下都是禁止使用 select* 操作。

SELECT user_id,sso_id,sso_code,create_time,update_time,login_ip,state 
FROM ms_user_sso WHERE user_id = '1';

删除数据

DELETE FROM ms_user_sso WHERE user_id = '2' ;

不带where条件,就是删除全部数据。原则上不允许该操作,优化篇会详解。TRUNCATE TABLE也是清空表数据,但是占用的资源相对较少。

2.6.2:数据安全
  • 不可逆加密

这类加密算法,多用来做数据验证操作,比如常见的密码验证。

SELECT MD5('cicada')='94454b1241ad2cfbd0c44efda1b6b6ba' ;
SELECT SHA('cicada')='0501746a2e4fd34e1d14015fc4d58309585edc7d';
SELECT PASSWORD('smile')='*B4FB95D86DCFC3F33A3852714DC742C77504479D' ;
  • 可逆加密

安全性要求高的系统,需要做三级等保,对数据的安全性极高,数据在存储时必须加密入库,取出时候需要解密,这些就需要可逆加密。

SELECT DECODE(ENCODE('123456','key_salt'),'key_salt') ;
SELECT AES_DECRYPT(AES_ENCRYPT('cicada','salt123'),'salt123');

上述数据安全的管理,也可以基于应用系统的服务(代码)层进行处理,相对专业的流程是从数据生成源头处理,规避数据传递过程泄露,造成不必要的风险。

3、设计范式

3.1:三范式

  • 基础概念

一范式

表的列的具有原子性,不可再分解,即列的信息,不能分解,关系型数据库MySQL、Oracle等自动的满足。

二范式

每个事实的数据记录只会出现一次, 不会冗余, 通常设计一个主键来实现。

三范式

要求一个表中不包含已经存在于其它表的非主键信息,例如部门和员工的信息,员工表包含部门表的主键ID,则可以关联获取相关信息,没必要在员工表保存相关信息。

  • 优缺点对比

范式化设计

范式化结构设计通常更新快,因为冗余数据较少,表结构轻巧,也更好的写入内存中。但是查询起来涉及到关联,代价非常高,非常损耗查询性能。

反范式化设计

所有的数据都在一张表中,避免关联查询,索引的有效性更高,但是数据的冗余性极高。

  • 建议结论

上述的两种设计方式在实际开发中都是不存在的,在实际开发中都是混合使用。比如汇总统计,缓存数据,都会基于反范式化的设计。

你可能感兴趣的:(数据库)