数据库枚举类型:精准控制对象状态 (数据库枚举类型 对象)

随着现代软件应用程序的不断发展,数据的存储和处理越来越复杂,因此在数据库设计中,枚举类型在控制对象状态方面变得越来越重要。枚举类型是一种特殊的数据类型,用于定义具有预定义值列表的变量。使用枚举类型时,可以更好地控制对象状态,并减少错误的发生。

枚举类型可以理解为一组常量,这些常量具有相似性质的预定义值。例如,在一个银行系统中,可以使用枚举类型”账户状态”,预定义值包括:激活、冻结、挂失等等。这样,可以将数据库中的每个账户的状态设置为枚举类型,使得操作员可以更好地控制账户状态,并且避免一些错误操作。

数据库中,通过枚举类型将数据类型转化为预先定义的值列表而实现对不同类型状态的控制。枚举类型的应用范围非常广泛,可以用于处理许多类型的数据。例如,性别、标签、等级、权限、类别等等,都可以使用枚举类型定义,从而更好地控制对象状态。

枚举类型的优点在于控制对象状态的精确性。使用枚举类型,不仅可以明确对象的不同状态,还能够强制执行预定义的值。相比较于其他类型的数据定义方式,枚举类型能够有效地提高代码的可读性、可维护性和稳定性。

在数据库中使用枚举类型时,需要注意一些问题。需要设计一个合理的枚举值列表,并避免增长过快或过于复杂。过于复杂的枚举值列表会增加代码的难度和维护成本。需要对枚举类型进行妥善的文档记录和注释,以便未来更好地维护和理解代码。

在编写数据库设计方案时,为了更好地使用枚举类型,需要考虑一些因素。例如,需要考虑每个对象状态的可用性和有效性,以及在条件和筛选查询中使用枚举类型的效率等等。

数据库枚举类型是一种灵活、强大的工具,用于控制对象状态。通过使用枚举类型,可以更好地控制数据,减少错误和维护成本,并提高软件应用程序的质量。为了更好地使用枚举类型,需要合理安排枚举值列表,并进行良好的文档记录和注释,在实际应用中不断优化。

相关问题拓展阅读:

mysql里 enum(F,M,S)什么意思I

枚举类型的值 有自己设定的

枚举类型ENUM

对枚举类型字段存储数据的数据测试案例分享和总结文章为MySQL数据库数据类型之枚举类型ENUM数据测试总结,对枚举类型字段进行DDL变更操作支持的案例分享和总结文章为MySQL数据库之枚举数据类型ENUM的DDL变更测试,通过详尽的测试对比过程,对MySQL枚举类型的特点非常清晰,我们再简要综合地回顾枚举类型的优缺点:

l 优点

1)MySQL枚举类型的枚举元素允许更大65535个,基本够绝大多数衡指胡业务场景使用;

2)引入枚举类型数咐拦据存储,有利于缩减数据库存储数据的容量,尤其能达到减少数据库瓶颈更大的物理IO,逻辑IO也能减小,提高主机的处理能力;

3)引入枚举类型数据存储,有利于简化工程师的代码复杂度、工作量,增加代码的可读性和可维护性;

4)可以通过枚举类型元素值访问数据,也可以根据枚举类型元素编号进行访问数据;

l 缺点

1)MySQL数据库枚举类型的引入,可能给软件程序的版本发布,存在遗忘数据库结构变更的隐患;

2)MySQL数据库枚举类型字段的元素增加,必须以尾部追加的方式,否则影响数据库提供数据服务;

3)枚举类型字段不再需要的元素,也不能进行删除,否则影响数据库提供数据服务;

4)MySQL数据库枚举类型的字段定义属性元素值,不能随意调整其顺序,否则影响数据库提供数据逗孙服务;

建议:

MySQL数据库枚举类型是一种有应用场景广泛的数据类型,若是抛开网站程序或软件版本发布,可能会导致开发工程师与数据库维护人员之间没有配合好的问题,非常推荐大家把枚举类型引入到生产环境的数据库应用中,对企业而言也可以起到节省人力、物理等成本。建议大家使用枚举类型的时候,尽量把可能需要用到的枚举元素,都写到MySQL数据库表字段的定义属性中,减少出现漏做DDL变更的故障。

根据用户定义的枚举值与分片节点映射文件,直接定位目标分片。

用户在rule.xml中配置枚举值文件路径和分片索引是字符串还是数字,DBLE在启动时会将枚举值文件加载到内存中,形成一个映射表

在DBLE的运行过程中,用户访问使用这个算法的表时,WHERE子句中的分片索引值会被提取出来,直接查映射表得到分片编号

与MyCat的类似分片算法对比

中间件

DBLE

MyCat

分片算法种类    enum 分区算法    分片枚举    

两种中间件的枚举分片算法使用上无差别。

开发注意点

【分片索引】1. 整型数字(可以为负数)或字符串((不含=和换行符)

【分片索引】2. 枚举值之间不能重复

Male=0Male=1

或者

123=1123=2

会导致分片策略加载出错

【分片索引】3. 不同枚举值可以映射到同一个分片上

Mr=0Mrs=1Miss=1Ms=1123=0

运维注意点

【扩容】1. 增加枚举值无需数据再平衡

【扩容】2. 增加一个枚举值的分片数量数时,需要对局部数据进行迁移

【缩容】1. 减少枚举值需要御氏数据再平衡

【缩容】2. 减少一个枚举值的分片数量数时,需要对局部数据进行迁移

配置注意点

【配置项】1. 在 rule.xml 中,可配置项为  、 和  

【配置项】2. 在 rule.xml 中配置  标签,非必须配置项,不配置该项的话,用户的分片索引值没落在 mapFile 定义的范岁兄围时,DBLE 会报错;若需要配置,必须为非负整数,用户的分片索引值没落在 mapFile 定义的范围时,DBLE 会路由至这个值的 MySQL 分片

【配置项】3. 在 rule.xml 中配置  标签,范围映射文件的路径:若在映射文件在 DBLE_HOME/conf 或其中,则可以使用相对路径的形式配置,例如,映射文件是 DBLE_HOME/conf/map/table_map.txt 时,配置值就可以简写为 map/table_map.txt;映射文件在 DBLE_HOME/conf 目录以外时,需要使用绝对路径,但这种做法需要考虑用户权限等问题,因此不建议把映射文件放在 DBLE_HOME/conf 外。

【配置项】4. 编辑 mapFile 所配置的文件

记录格式为:=

枚举值可以是整型数字,或任意字符(除了=和换行符),分片编号必须是非负整型数字,记录之间以换行分隔,一行仅能有一条记录,枚举值不能够是“DEFAULT_NODE”这个字符串,允许以“//”和“#”在行首来注释该行

【配置项】5. 在 rule.xml 中配置  标签;type 必须为整型;取值为 0 时,mapFile 的必须为整型;取值乎拆袭为非 0 时,mapFile 的可以是任意字符(除了=和换行符)

enum是枚举类型,表示这个字段中的数据只能为F,M,S三个值中的一个

关于MYSQL 时间类型存储在数据库里是什么类型

Mysql中经常用来存储日期的数据类型有三种:Date、Datetime、Timestamp。

Date数据类型:用来存储没有做并返时间的日期。Mysql获取和显示这个类型的格式为“YYYY-MM-DD”。支持的时间范围为“”到“”。

Datetime类型:存储既有日期又有时间的数据。存储和显示的格式为 “YYYY-MM-DD HH:MM:SS”。支持的时间范围是“:00:00”到“:59:59”。

Timestamp类型:也是存储既有日期又有时间的数据。存储和显示的格式跟Datetime一样。支持的时间范围是“:00:01”到“:14:07”。

所有不符合上面所述蔽轮格式的数据都纯饥会被转换为相应类型的0值。(或者:00:00)

MySQL 数据类型细分下来,大概有以下几类:

数值,典型代表为 tinyint,int,bigint

浮点/定点,典型代表为 float,double,decimal 以及相关的同义词

字符串,典型代表为 char,varchar

时间日期,典型代表为 date,datetime,time,timestamp

二进制,典型代表为 binary,varbinary

位类型

枚举类型

类型

大对象,比如 text,blob

json 文档类型

一、数值类型(不是数据类型,别看错了)如果用来存放整数,根据范围的不同,选择不同的类型。

以上是几个整数选激尘野型的例子。整数的应用范围最广泛,可以用来存明喊储数字,也可以用来存储时间戳,还可以用来存储其他类型转换为数字后的编码,如 IPv4 等。示例 1用 int32 来存放 IPv4 地址,比单纯用字符串节省空间。表 x1,字段 ipaddr,利用函数 inet_aton,检索的话用函数 inet_ntoa。

查看磁盘空间占用,t3 占用更大,t1 占用最小。所以说如果整数存储范围有固定上限,并且未来也没有必要扩容的话,建议选择最小的类型,当然了对其他类型也适用。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl总用量 3.0GM -rw-rmysql mysql 860M 12月 10 11:36 t1.ibdM -rw-rmysql mysql 988M 12月 10 11:38 t2.ibd.2G -rw-rmysql mysql 1.2G 12月 10 11:39 t3.ibd

二、浮点数 / 定点数先说 浮点数,float 和 double 都代表浮点数,区别简单记就是 float 默认占 4 Byte。float(p) 中的 p 代表整数位最小精度。如果 p > 24 则直接转换为 double,占 8 Byte。p 更大值为 53,但更大值存在计算不精确的问题。再说 定点数,包括 decimal 以及同兄亮义词 numeric,定点数的整数位和小数位分别存储,有效精度更大不能超过 65。所以区别于 float 的在于精确存储,必须需要精确存储或者精确计算的更好定义为 decimal 即可。示例 3创建一张表 y1,分别给字段 f1,f2,f3 不同的类型。mysql-(ytt/3305)->create table y1(f1 float,f2 double,f3 decimal(10,2));Query OK, 0 rows affected (0.03 sec)

三、字符类型字符类型和整形一样,用途也很广。用来存储字符、字符串、MySQL 所有未知的类型。可以简单说是万能类型!

char(10) 代表更大支持 10 个字符存储,varhar(10) 虽然和 char(10) 可存储的字符数一样多,不同的是 varchar 类型存储的是实际大小,char 存储的理论固定大小。具体的字节数和字符集相关。示例 4例如下面表 t4 ,两个字段 c1,c2,分别为 char 和 varchar。mysql-(ytt/3305)->create table t4 (c1 char(20),c2 varchar(20));Query OK, 0 rows affected (0.02 sec)

所以在 char 和 varchar 选型上,要注意看是否合适的取值范围。比如固定长度的值,肯定要选择 char;不确定的值,则选择 varchar。

四、日期类型日期类型包含了 date,time,datetime,timestamp,以及 year。year 占 1 Byte,date 占 3 Byte。 

time,timestamp,datetime 在不包含小数位时分别占用 3 Byte,4 Byte,8 Byte;小数位部分另外计算磁盘占用,见下面表格。

请点击输入图片描述

请点击输入图片描述

请点击输入图片描述

注意:timestamp 代表的时间戳是一个 int32 存储的整数,取值范围为 ‘:00:01.000000’ 到 ‘:14:07.999999’;datetime 取值范围为 ‘:00:00.000000’ 到 ‘:59:59.999999’。 

综上所述,日期这块类型的选择遵循以下原则:

1. 如果时间有可能超过时间戳范围,优先选择 datetime。2. 如果需要单独获取年份值,比如按照年来分区,按照年来检索等,更好在表中添加一个 year 类型来参与。3. 如果需要单独获取日期或者时间,更好是单独存放,而不是简单的用 datetime 或者 timestamp。后面检索时,再加函数过滤,以免后期增加 SQL 编写带来额外消耗。

4. 如果有保存毫秒类似的需求,更好是用时间类型自己的特性,不要直接用字符类型来代替。MySQL 内部的类型转换对资源额外的消耗也是需要考虑的。

示例 5

建立表 t5,对这些可能需要的字段全部分离开,这样以后写 SQL 语句的时候就很容易了。

当然了,这种情形占用额外的磁盘空间。如果想在易用性与空间占用量大这两点来折中,可以用 MySQL 的虚拟列来实时计算。比如假设 c5 字段不存在,想要得到 c5 的结果。mysql-(ytt/3305)->alter table t5 drop c5, add c5 year generated always as (year(c1)) virtual;Query OK, 1 row affected (2.46 sec)Records: 1  Duplicates: 0  Warnings: 0

五、二进制类型

binary 和 varbinary 对应了 char 和 varchar 的二进制存储,相关的特性都一样。不同的有以下几点:

binary(10)/varbinary(10) 代表的不是字符个数,而是字节数。

行结束符不一样。char 的行结束符是 \0,binary 的行结束符是 0x00。

由于是二进制存储,所以字符编码以及排序规则这类就直接无效了。

示例 6

来看这个 binary 存取的简单示例,还是之前的变量 @a。

切记!这里要提前计算好 @a 占用的字节数,以防存储溢出。

六、位类型

bit 为 MySQL 里存储比特位的类型,更大支持 64 比特位, 直接以二进制方式存储,一般用来存储状态类的信息。比如,性别,真假等。具有以下特性:

1. 对于 bit(8) 如果单纯存放 1 位,左边以 0 填充。2. 查询时可以直接十进制来过滤数据。3. 如果此字段加上索引,MySQL 不会自己做类型转换,只能用二进制来过滤。

示例 7

创建表 c1, 字段性别定义一个比特位。mysql-(ytt/3305)->create table c1(gender bit(1));Query OK, 0 rows affected (0.02 sec)

mysql-(ytt/3305)->select cast(gender as unsigned)  ‘f1’ from c1;+——+| f1   |+——+|    0 ||    1 |+——+2 rows in set (0.00 sec)

过滤数据也一样,二进制或者直接十进制都行。mysql-(ytt/3305)->select conv(gender,16,10) as gender \   -> from c1 where gender = b’1′; ++| gender |++||++1 row in set (0.00 sec)    mysql-(ytt/3305)->select conv(gender,16,10) as gender \    -> from c1 where gender = ‘1’;++| gender |++||++1 row in set (0.00 sec)

其实这样的场景,也可以定义为 char(0),这也是类似于 bit 非常优化的一种用法。

mysql-(ytt/3305)->create table c2(gender char(0));Query OK, 0 rows affected (0.03 sec)

那现在我给表 c1 简单的造点测试数据。

mysql-(ytt/3305)->select count(*) from c1;++| count(*) |++||++1 row in set (1.37 sec)

把 c1 的数据全部插入 c2。

mysql-(ytt/3305)->insert into c2 select if(gender = 0,”,null) from c1;Query OK,rows affected (2 min 18.80 sec)Records:Duplicates: 0  Warnings: 0

两张表的磁盘占用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl总用量 1.9GM -rw-rmysql mysql 932M 12月 11 10:16 c1.ibdM -rw-rmysql mysql 916M 12月 11 10:22 c2.ibd

检索方式稍微有些不同,不过效率也差不多。所以说,字符类型不愧为万能类型。

七、枚举类型

枚举类型,也即 enum。适合提前规划好了所有已经知道的值,且未来更好不要加新值的情形。枚举类型有以下特性:

1. 更大占用 2 Byte。2. 更大支持个不同元素。3. MySQL 后台存储以下标的方式,也就是 tinyint 或者 allint 的方式,下标从 1 开始。4. 排序时按照下标排序,而不是按照里面元素的数据类型。所以这点要格外注意。

示例 8

创建表 t7。mysql-(ytt/3305)->create table t7(c1 enum(‘mysql’,’oracle’,’dble’,’postgresql’,’mongodb’,’redis’,’db2′,’sql server’));Query OK, 0 rows affected (0.03 sec)

八、类型

类型 SET 和枚举类似,也是得提前知道有多少个元素。SET 有以下特点:

1. 更大占用 8 Byte,int64。2. 内部以二进制位的方式存储,对应的下标如果以十进制来看,就分别为 1,2,4,8,…,pow(2,63)。3. 更大支持 64 个不同的元素,重复元素的插入,取出来直接去重。4. 元素之间可以组合插入,比如下标为 1 和 2 的可以一起插入,直接插入 3 即可。

示例 9

定义表 c7 字段 c1 为 set 类型,包含了 8 个值,也就是下表更大为 pow(2,7)。

mysql-(ytt/3305)->create table c7(c1 set(‘mysql’,’oracle’,’dble’,’postgresql’,’mongodb’,’redis’,’db2′,’sql server’));Query OK, 0 rows affected (0.02 sec)

插入 1 到 128 的所有组合。

mysql-(ytt/3305)->INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS (SELECT 1 AS cntUNION ALLSELECT cnt +FROM ytt_numberWHERE cnt select ytt_sample_data_type(1111,222) ‘result’;++| result     |++| The result is: ‘246642’. |++1 row in set (0.00 sec)

总结

本篇把 MySQL 基本的数据类型做了简单的介绍,并且用了一些容易理解的示例来梳理这些类型。我们在实际场景中,建议选择适合最合适的类型,不建议所有数据类型简单的更大化原则。比如能用 varchar(100),不用 varchar(1000)。

数据库枚举类型 对象的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于数据库枚举类型 对象,数据库枚举类型:精准控制对象状态,mysql里 enum(F,M,S)什么意思I,关于MYSQL 时间类型存储在数据库里是什么类型的信息别忘了在本站进行查找喔。


数据运维技术 » 数据库枚举类型:精准控制对象状态 (数据库枚举类型 对象)