数据库结构是指在计算机的存储设备上合理存放的相关联的有结构的数据集合的结构。一个数据库结构含有各种成分,包括数据库、数据表、字段等。
数据库(Database)
Visual Basic中使用的数据库是关系型数据库(Relational Database)。一个数据库由一个或一组数据表组成。每个数据库都以文件的形式存放在磁盘上,即对应于一个物理文件。不同的数据库,与物理文件对应的方式也不一样。对于dBASE,FoxPro和Paradox格式的数据库来说,一个数据表就是一个单独的数据库文件,而对于Microsoft Access、Btrieve格式的数据库来说,一个数据库文件可以含有多个数据表。
1、数据表(Table)
简称表,由一组数据记录组成,数据库中的数据是以表为单位进行组织的。一个表是一组相关的按行排列的数据;每个表中都含有相同类型的信息。
表实际上是一个二维表格,例如,一个班所有学生的考试成绩,可以存放在一个表中,表中的每一行对应一个学生,这一行包括学生的学号,姓名及各门课程成绩。
2、记录(Record)
表中的每一行称为一个记录,它由若干个字段组成。
3、字段(Field)
也称域。表中的每一列称为一个字段。每个字段都有相应的描述信息,如数据类型、数据宽度等。
扩展资料:
数据库结构的其他组成结构:
1、索引(Index)
为了提高访问数据库的效率,可以对数据库使用索引。当数据库较大时,为了查找指定的记录,则使用索引和不使用索引的效率有很大差别。
索引实际上是一种特殊类型的表,其中含有关键字段的值(由用户定义)和指向实际记录位置的指针,这些值和指针按照特定的顺序(也由用户定义)存储,从而可以以较快的速度查找到所需要的数据记录。
2、查询(Query)
一条SQL(结构化查询语言)命令,用来从一个或多个表中获取一组指定的记录,或者对某个表执行指定的 *** 作。当从数据库中读取数据时,往往希望读出的数据符合某些条件,并且能按某个字段排序。使用SQL,可以使这一 *** 作容易实现而且更加有效。
SQL是非过程化语言(有人称为第四代语言),在用它查找指定的记录时,只需指出做什么,不必说明如何做。每个语句可以看作是一个查询(query),根据这个查询,可以得到需要的查询结果。
3、过滤器(Filter)
过滤器是数据库的一个组成部分,它把索引和排序结合起来,用来设置条件,然后根据给定的条件输出所需要的数据。
4、视图(view)
数据的视图指的是查找到(或者处理)的记录数和显示(或者进行处理)这些记录的顺序。在一般情况下,视图由过滤器和索引控制。
参考资料来源:百度百科-数据库结构
数据库的基本结构数据库的基本结构分三个层次,反映了观察数据库的三种不同角度。
(1)物理数据层。它是数据库的最内层,是物理存贮设备上实际存储的数据的集合。这些数据是原始数据,是用户加工的对象,由内部模式描述的指令 *** 作处理的位串、字符和字组成。
(2)概念数据层。它是数据库的中间一层,是数据库的整体逻辑表示。指出了每个数据的逻辑定义及数据间的逻辑联系,是存贮记录的集合。它所涉及的是数据库所有对象的逻辑关系,而不是它们的物理情况,是数据库管理员概念下的数据库。
(3)逻辑数据层。它是用户所看到和使用的数据库,表示了一个或一些特定用户使用的数据集合,即逻辑记录的集合。
数据库不同层次之间的联系是通过映射进行转换的。数据库具有以下主要特点:
(1)实现数据共享。数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。
(2)减少数据的冗余度。同文件系统相比,由于数据库实现了数据共享,从而避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的一致性。
(3)数据的独立性。数据的独立性包括数据库中数据库的逻辑结构和应用程序相互独立,也包括数据物理结构的变化不影响数据的逻辑结构。
(4)数据实现集中控制。文件管理方式中,数据处于一种分散的状态,不同的用户或同一用户在不同处理中其文件之间毫无关系。利用数据库可对数据进行集中控制和管理,并通过数据模型表示各种数据的组织以及数据间的联系。
(5)数据一致性和可维护性,以确保数据的安全性和可靠性。主要包括:①安全性控制:以防止数据丢失、错误更新和越权使用;②完整性控制:保证数据的正确性、有效性和相容性;③并发控制:使在同一时间周期内,允许对数据实现多路存取,又能防止用户之间的不正常交互作用;④故障的发现和恢复:由数据库管理系统提供一套方法,可及时发现故障和修复故障,从而防止数据被破坏
一、数据场景 1、表结构简介 任何工具类的东西都是为了解决某个场景下的问题,比如Redis缓存系统热点数据,ClickHouse解决海量数据的实时分析,MySQL关系型数据库存储结构化数据。数据的存储则需要设计对应的表结构,清楚的表结构,有助于快速开发业务,和理解系统。表结构的设计通常从下面几个方面考虑:业务场景、设计规范、表结构、字段属性、数据管理。2、用户场景
例如存储用户基础信息数据,通常都会下面几个相关表结构:用户信息表、单点登录表、状态管理表、支付账户表等。
用户信息表
存储用户三要素相关信息:姓名,手机号,身份z,登录密码,邮箱等。
CREATE TABLE `ms_user_center` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',`user_name` varchar(20) NOT NULL COMMENT '用户名',`real_name` varchar(20) DEFAULT NULL COMMENT '真实姓名',`pass_word` varchar(32) NOT NULL COMMENT '密码',`phone` varchar(20) NOT NULL COMMENT '手机号',`email` varchar(32) DEFAULT NULL COMMENT '邮箱',`head_url` varchar(100) DEFAULT NULL COMMENT '用户头像URL',`card_id` varchar(32) DEFAULT NULL COMMENT '身份z号',`user_sex` int(1) DEFAULT '1' COMMENT '用户性别:0-女,1-男',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表' 单点登录表
用意是在多个业务系统中,用户登录一次就可以访问所有相互信任的业务子系统,是聚合业务平台常用的解决方案。
CREATE TABLE `ms_user_sso` (`user_id` int(11) NOT NULL COMMENT '用户ID',`sso_id` varchar(32) NOT NULL COMMENT '单点信息编号ID',`sso_code` varchar(32) NOT NULL COMMENT '单点登录码,唯一核心标识',`log_ip` varchar(32) DEFAULT NULL COMMENT '登录IP地址',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户单点登录表' 状态管理表
系统用户在使用时候可能出现多个状态,例如账户冻结、密码锁定等,把状态聚合到一起,可以更加方便的管理和验证。
CREATE TABLE `ms_user_status` (`user_id` int(11) NOT NULL COMMENT '用户ID',`account_status` int(1) DEFAULT '1' COMMENT '账户状态:0-冻结,1-未冻结',`real_name_status` int(1) DEFAULT '0' COMMENT '实名认证状态:0-未实名,1-已实名',`pay_pass_status` int(1) DEFAULT '0' COMMENT '支付密码是否设置:0-未设置,1-设置',`wallet_pass_status` int(1) DEFAULT '0' COMMENT '钱包密码是否设置:0-未设置,1-设置',`wallet_status` int(1) DEFAULT '1' COMMENT '钱包是否冻结:0-冻结,1-未冻结',`email_status` int(1) DEFAULT '0' COMMENT '邮箱状态:0-未激活,1-激活',`message_status` int(1) DEFAULT '1' COMMENT '短信提醒开启:0-未开启,1-开启',`letter_status` int(1) DEFAULT '1' COMMENT '站内信提醒开启:0-未开启,1-开启',`emailmsg_status` int(1) DEFAULT '0' COMMENT '邮件提醒开启:0-未开启,1-开启',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户状态表' 支付账户表
用户交易的核心表,存储用户相关的账户资金信息。
CREATE TABLE `ms_user_wallet` (`wallet_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '钱包ID',`user_id` int(11) NOT NULL COMMENT '用户ID',`wallet_pwd` varchar(32) DEFAULT NULL COMMENT '钱包密码',`total_account` decimal(20,2) DEFAULT '0.00' COMMENT '账户总额',`usable_money` decimal(20,2) DEFAULT '0.00' COMMENT '可用余额',`freeze_money` decimal(20,2) DEFAULT '0.00' COMMENT '冻结金额',`freeze_time` datetime DEFAULT NULL COMMENT '冻结时间',`thaw_time` datetime DEFAULT NULL COMMENT '解冻时间',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`state` int(1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`wallet_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户钱包' 二、设计规范 1、涉及模块
通过上面几个表设计的案例,可以看到表设计关联到数据库的各个方面知识:数据类型,索引,编码,存储引擎等。表设计是一个很大的命题,不过也遵循一个基本规范:三范式。
2、三范式 基础概念
一范式
表的列的具有原子性,不可再分解,即列的信息,不能分解,关系型数据库MySQL、Oracle等自动的满足。
二范式
每个事实的数据记录只会出现一次, 不会冗余, 通常设计一个主键来实现。
三范式
要求一个表中不包含已经存在于其它表的非主键信息,例如部门和员工的信息,员工表包含部门表的主键ID,则可以关联获取相关信息,没必要在员工表保存相关信息。
优缺点对比
范式化设计
范式化结构设计通常更新快,因为冗余数据较少,表结构轻巧,也更好的写入内存中。但是查询起来涉及到关联,代价非常高,非常损耗查询性能。
反范式化设计
所有的数据都在一张表中,避免关联查询,索引的有效性更高,但是数据的冗余性极高。
建议结论
上述的两种设计方式在实际开发中都是不存在的,在实际开发中都是混合使用。比如汇总统计,缓存数据,都会基于反范式化的设计。
三、字段属性
合适的字段类型对于高性能来说非常重要,基本原则如下:简单的类型占用资源更少;在可以正确存储数据的情况下,选最小的数据类型。
1、数据类型选择 整数类型
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,根据数据类型范围合理选择即可。
实数类型
FLOAT、DOUBLE、DECIMAL,建议资金货币相关类型使用高精度DECIMAL存储,或者把数据成倍扩大为整数,采用BIGINT存储,不过处理相对麻烦。
字符类型
CHAR、VARCHAR,长度不确定建议采用VARCHAR存储,不过VARCHAR类型需要额外开销记录字符串长度。CHAR适合存储短字符,或者定长字符串,例如MD5的加密结构。
时间类型
DATETIME、TIMESTAMP,DATETIME保存大范围的值,精度秒。TIMESTAMP以时间戳的格式,范围相对较小,效率也相对较高,所以通常情况建议使用。
MySQL的字段类型有很多种,可以根据数据特性选择合适的,这里只描述常见的几种类型。
2、基础用法 *** 作 数据类型
修改字段类型
ALTER TABLE ms_user_sso MODIFY state CHAR(1) DEFAULT '0'ALTER TABLE ms_user_sso MODIFY state INT(1) DEFAULT '1' COMMENT '状态:0不可用,1可用'
修改名称位置
ALTER TABLE ms_user_sso CHANGE log_ip login_ip VARCHAR(32) AFTER update_time 索引使用
索引类型:主键索引,普通索引,唯一索引,组合索引,全文索引。这里演示普通索引的 *** 作。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四、表结构管理 1、查看结构DESC ms_user_status SHOW CREATE TABLE ms_user_status2、字段结构 添加字段 ALTER TABLE ms_user_status ADD `delete_time` datetime DEFAULT NULL COMMENT '删除时间' 删除字段 ALTER TABLE ms_user_status DROP COLUMN delete_time3、修改表名ALTER TABLE ms_user_center RENAME ms_user_info4、存储引擎 存储引擎 SELECT VERSION() SHOW ENGINES
MySQL 5.6 支持的存储引擎有InnoDB、MyISAM、Memory、Archive、CSV、BLACKHOLE等。一般默认使用InnoDB,支持事务管理。该模块MySQL核心,后续详解。
修改引擎
数据量大的场景下,存储引擎修改是一个难度极大的 *** 作,容易会导致表的特性变动,引起各种后续反应,后续会详说。
ALTER TABLE ms_user_sso ENGINE = MyISAM5、修改编码
表字符集默认使用utf8,通用,无乱码风险,汉字3字节,英文1字节,utf8mb4是utf8的超集,有存储4字节例如表情符号时使用。
查看编码 SHOW VARIABLES LIKE 'character%' 修改编码 ALTER TABLE ms_user_sso DEFAULT CHARACTER SET utf8mb4五、数据管理 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 SETuser_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、数据安全 不可逆加密
这类加密算法,多用来做数据验证 *** 作,比如常见的密码验证。
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')
上述数据安全的管理,也可以基于应用系统的服务(代码)层进行处理,相对专业的流程是从数据生成源头处理,规避数据传递过程泄露,造成不必要的风险。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)