设计数据库表时数据类型的选择

设计数据库表时数据类型的选择

1. 整数类型

整数类型有:tinyint、smallint、mediumint、int、bigint,分别使用 8、16、24、32、64 位存储空间。

它们可以存储的值范围从 -2 的 (n-1) 次方到 2 的 (n-1) 次方 -1,n 是存储空间的位数。

整数有可选的 unsigned 属性(无符号类型),表示不允许有负值,因此可以使正数上限提高一倍。

有符号和无符号类型使用相同的存储空间,并具有相同的性能,因此可以根据实际情况选择合适的类型。

2.  实数类型

实数类型有:FLOAT、DOUBLE ,分别占用 4,8 字节。

如果插入值的精度(即:数字总位数)高于实际定义的精度,系统会自动进行四舍五入处理,使值的精度达到要求。

其中 DECIMAL 也可以用来指定精度,并且它比 FLOAT 和 DOUBLE 更适合做精确计算。在本文就不做详细介绍了,如果有人想了解的话可以给我留言,我下次再写。

3. 字符串类型

字符串类型有:VARCHAR、CHAR、BLOB、TEXT

对比内容        VARCHAR CHAR

是否固定长度        否    是

存储上限字节        65535      255

保存或检索值时,是否删除字符串末尾空格    否    是

超过设置的范围后,字符串是否会被截断        否    是

除了以上不同之外,VARCHAR 还需要额外使用 1 个或 2 个字节来记录字符串长度。如果列的最大长度小于或等于 255 字节,则使用 1 个字节,否则使用 2 个字节。

由于 VARCHAR 是变长的,所以在 update 时,可能使行变得比原来更长,这就导致需要进行额外的工作。如果一个行占用的空间增加,并且在页内没有更多空间可以存储,在这种情况下,不同存储引擎的处理方式不一样的。例如:MyISAM 会将行拆分为不同的片段存储,InnoDB 则需要分裂页来使行可以放进页内。

在选择使用场景上,重点要抓住 VARCHAR 是变长,CHAR 是定长的特点。

比如在这些情况更适合使用 VARCHAR:

字符串的最大长度比平均长度大很多;

字段更新次数少(所以碎片不是问题);

使用了像 UTF-8 这样复杂的字符集,每个字符都使用不同的字节数进行存储。

而在这些情况则更适合使用 CHAR:

存储很短的字符串(而 VARCHAR 还要多一个字节来记录长度,本来打算节约存储的现在反而得不偿失)

定长的字符串(如 MD5、uuid);

需要频繁修改的字段。因为 VARCHAR 每次存储都要有额外的计算,得到长度等工作;

使用 VARCHAR(5) 和 VARCHAR(200) 来存储 ‘hello’ 的空间开销是一样的。那么使用更短的列有什么好处呢?因为更长的列会消耗更多的内存。MySQL 通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序或操作时会特别糟糕。在利用磁盘临时进行排序时也同样糟糕。

所以最好的策略是只分配真正需要的空间。

4. 日期和时间类型

对比内容        TIMESTAMP     DATETIME

占用字节        4       8

时间范围        1970-01-01 08:00:01 ~ 2038-01-19 11:14:07    1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

存储的数据是否随时区变化        是    否

如果在插入数据时,没有指定第一个 TIMESTAMP 列的值,MySQL 则将这个列设置为当前时间,同时 TIMESTAMP 比 DATETIME 的空间效率更高。

5. 设计合理的数据类型

三点设计原则:

更小的通常更好

简单就好

尽量避免 NULL

注意:

一般情况下,应该选择可以正确存储数据的最小数据类型,因为它们占用更少的磁盘、内存和 CPU 缓存,并且处理时需要的 CPU 周期也更少。

简单数据类型的操作需要更少的 CPU 周期。例如,整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整型比较更复杂。

通常情况下,最好指定列为 NOT NULL,除非真的需要存储 NULL 值。因为可为 NULL 的列会使索引、索引统计和值比较都更复杂。可为 NULL 的列会使用更多的存储空间,在 MySQL 里也需要特殊处理。

当可为 NULL 的列被索引时,每个索引需要一个额外的字节,在 MyISAM 里甚至还可能导致固定大小的索引变成可变大小的索引。通常把可为 NULL 的列改为 NOT NULL 带来的性能比较小,所以在优化时没有必要先在现有表里修改这种情况。

这是我所学到的一些知识,在此分享给大家,希望可以帮助到你们。

以上就是我的分享,新手上道,请多多指教。如果有更好的方法或不懂得地方欢迎在评论区教导和提问喔!

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如何设计数据库表 一、简介   在设计数据库时,最重要的步骤是要确保数据正确分布到数据库的表中。使用正确 的数据结构,可以极大地简化应用程序的其他内容(查询、窗体、报表、代码等)。正 确进行表设计的正式名称是"数据库规范化"。   本文简要介绍数据库规范化的基本概念和一些需要注意并力求避免的常见问题。   1.理解您的数据   在设计表之前,应明确您打算如何处理数据,还要了解随着时间的推移数据会发生 什么样的变化。您所做的假设将会影响最终的设计。   2.您需要什么样的数据   设计应用程序时,关键要了解设计的最终结果,以便确保您准备好所有必需的数据 并知道其来源。例如,报表的外观、每个数据的来源以及所需的所有数据是否都存在。 对项目损失最大的莫过于在项目后期发现重要报表缺少数据。   3.明确所需数据的类型和来源 知道需要什么样的数据后,就必须确定数据的来源。数据是否从其他数据源中导入?数 据是否需要清理或验证?用户是否需要输入数据?明确所需数据的类型和来源是数据库 设计的第一步。   4.您打算如何处理这些数据?   用户是否需要编辑这些数据?如果需要,应如何显示数据以便于用户理解和编辑? 有没有验证规则和相关的查找表?要求对编辑和删除保留备份的数据输入有没有相关联 的审核问题?需要为用户显示哪些摘要信息?是否需要生成导出文件?了解这些信息后 ,就可以想象字段之间是如何相互关联的了。   5数据之间如何相互关联?   将数据分组放入相关字段(例如与客户相关的信息、与发票相关的信息等),每个 字段组都代表要建立的表。然后考虑如何将这些表相互关联。例如,哪些表具有一对多 关系(例如,一个客户可能持有多张发票)?哪些表具有一对一关系(这种情况下,通 常会考虑将其组合到一个表中)?   6.随着时间的推移数据会发生什么样的变化?   设计表之后,常常会由于没有考虑时间的影响而导致以后出现严重问题。许多表设 计在当时使用时效果非常好,但是,常常会因为用户修改数据、添加数据以及随时间的 推移而崩溃。开发人员经常会发现需要重新设计表的结构来适应这些变化。表的结构发 生变化时,所有相关的内容(查询、窗体、报表、代码等)也必须随之更新。理解并预 测数据会随时间推移发生哪些变化,可以实现更好的设计,减少问题的发生。   7.学习如何使用查询   了解如何分析和管理数据同样很重要。您应该深刻理解查询的工作原理,理解如何 使用查询在多个表之间链接数据,如何使用查询对数据进行分组和汇总,以及如何在不 需要以规范化格式显示数据时使用交叉表查询。   好的数据设计的最终目标就是要平衡两个需要:既要随着时间的推移有效地存储数 据,又要轻松地检索和分析数据。理解查询的功能对正确设计表很有帮助。 二、数据库规范化概念   这部分介绍数据库规范化所涉及的基本概念,而不是对数据库规范化进行理论性的 探讨。如何在您的实际情况中应用这些概念可能会随着应用程序需要的不同而有所变化 。这部分的目的是理解这些基本概念、根据实际需要应用它们,并理解偏离这些概念将 会出现哪些问题。   将唯一信息存储在一个地方   大部分数据库开发人员都理解数据库规范化的基本概念。理想情况下,您希望将相 同的数据存储在同一个地方,并在需要引用时使用 ID 来进行引用。因此,如果某些信息发生了变化,则可以在一个地方进行更改,而整个程 序中的相应信息也会随之更改。   例如,客户表会存储每个客户的记录,包括姓名、地址、电话号码、电子邮件地址 以及其他特征信息。客户表中可能包含唯一的 CustomerID 字段(通常是 Autonumber 字段),这个字段即该表的主键字段,其他表使用它来引用该客户。因此,发票表可以 只引用客户的 ID 值,而不是在每张发票中存储客户的所有信息(因为同一个客户可能会持有多张发票) ,这样利用客户的 ID 值即可从客户表中查找客户的详细信息。使用 Access 中功能强大的窗体(使用组合框和子窗体),可以轻松地完成这项工作。如果需要修改 客户信息(例如新增电话号码),只需在客户表中修改,应用程序中引用该信息的任何 其他部分都会随之自动更新。   使用正确规范化的数据库,通过简单的编辑即可轻松处理数据随时间推移而发生的 更改。使用未正确规范化的数据库,通常需要利用编程或查询来更改多条记录或多个表 。这不仅会增加工作量,还会增加由于未正确执行代码或查询而导致数据不一致的可能 性。   记录是免费的,而新字段非常昂贵   理想的数据库应该只需要随着时间的推移添加新的记录,数据库表应该能够保存大 量记录。但是,如果您发现需要增加更多字段,则可能会碰到设计问题。   电子表格专家经常会遇到上述问题,因为他们习惯于按照设计电子表格的方式设计 数据库设计经常随时间变化的字段(例
1管理员表(L_Administrator) 字段名 字段说明 数据类型 约束 备注 a_id 管理员编号 int Primary Key Identity(1000,1) a_name 管理员姓名 nvarchar(20) Not null a_pwd 管理员密码 varchar(20) Not Null 2读者表(L_Reader) 字段名 字段说明 数据类型 约束 备注 r_id 读者编号 int Primary Key r_name 读者姓名 nvarchar(20) Not Null r_pwd 读者密码 varchar(20) Not Null r_sex 读者性别 bit Not Null r_typeid 职务类型 int Foreign Key 职务类型表的主键 r_academy 所在院系 nVarchar(20) r_major 专业 nVarchar(20) r_contact 联系方式 Varchar(20) r_email 邮箱 nvarchar(20) r_photo 读者照片 nVarchar(100) 存的是读者照片的路径 3职务类型表(L_Duty) 字段名 字段说明 数据类型 约束 备注 d_id 职务编号 int Primary Key Identity(1000,1) d_name 职务名称 nvarchar(20) Not null d_maxcount 最大借阅数量 tinyint Not Null 图书管理系统数据库设计全文共3页,当前为第1页。4图书信息表(L_Book) 图书管理系统数据库设计全文共3页,当前为第1页。 字段名 字段说明 数据类型 约束 备注 b_id 图书编号 Varchar(30) Primary Key b_name 图书名称 nvarchar(30) Not Null ISBN 国际标准图书编码 char(13) Foreign Key 13位数字组成 b_bkcaseid 书架编号 Varchar(20) b_price 定价 Numeric(10,2) b_author 作者 nvarchar(20) b_typeid 类型编号 int Foreign Key b_intime 入库时间 DataTime b_synopsis 图书简介 Nvarchar(500) b_state 图书状态 bit 0--借出,1--没有借出 b_photo 封面图片 Nvarchar(100) 存的是路径 5图书类型表(L_BookType) 字段名 字段说明 数据类型 约束 备注 bt_id 类型编号 int Primary Key Identity(1000,1) bt_name 类型名称 nVarchar(20) Not null 6出版社信息表(L_Publishing) 字段名 字段说明 数据类型 约束 备注 ISBN 国际标准图书编码 char(13) Primary Key p_name 出版社名称 nvarchar(30) Not Null 7借阅管理表(L_Borrow) 字段名 字段说明 数据类型 约束 备注 bw_id 借阅编号 int Primary Key Identity(1,1) bw_bookid 图书编号 Varchar(30) Foreign Key bw_readerid 读者编号 Int Foreign Key bw_outtime 借出日期 DateTime Not Null bw_endtime 到期日期 DateTime Not Null bw_backtime 归还日期 DateTime bw_isexpired 是否过期 Bit Not Null 默认为0--不过期 bw_fine 罚款数目 Numeric (10,2) 过期后才计算罚款数目 8图书资源表(L_Resource) 字段名 字段说明 数据类型 约束 备注 rs_id 资源编号 Int Primary Key Identity(1000,1) rs_name 资源名称 nVarchar(30) Not null rs_synopsis 资源简介 nVarchar(500) rs_amount 资源大小 int 单位为KB或是MB rs_type 资源类型 Varchar(20) 类似于doc、xsl、ppt、pdf、zip、rar、MP3、wmv等常用格式 图书管理系统数据库设计全文共3页,当前为第2页。9图书评论表(L_BookMarks) 图书管理系统数据库设计全文共3页,当前为第2页。 字段名 字段说明 数据类型 约束 备注 ISBN 国际标准图书编码 char(13) Foreign Key bm_contents 评论内容 Nvar
数据库与数据表设计 本讲大纲: 1、数据库分析 2、创建数据库 3、创建数据表 4、数据表逻辑关系 数据库与数据表设计全文共28页,当前为第1页。 数据库分析 企业人事管理系统主要用来记录一个企业中所有员工的基本信息以及每个员工的工作简历、家庭成员、奖惩记录等,数据量是根据企业员工的多少来决定的。 数据库与数据表设计全文共28页,当前为第2页。 创建数据库 选择"开始"/"所有程序"/Microsoft SQL Server 2008/SQL Server Management Studio命令,如下图所示。 数据库与数据表设计全文共28页,当前为第3页。 创建数据表 在已经创建的数据库db_PWMS中创建23个数据表,创建完成后的部分数据表及其记录数据如下图所示。 数据库与数据表设计全文共28页,当前为第4页。 连接服务器 数据库与数据表设计全文共28页,当前为第5页。 新建数据库 数据库与数据表设计全文共28页,当前为第6页。 数据库命名,添加数据库 数据库与数据表设计全文共28页,当前为第7页。 Db_pwmswei新建数据库 数据库与数据表设计全文共28页,当前为第8页。 创建数据表展开新建的db_pwms,中"表"的节点,单机右键,弹出的菜单中选择"新建表"。 数据库与数据表设计全文共28页,当前为第9页。 在SQL server 2008管理器的右边显示一个新表,这里输入要创建的表中素需要的字段,并设置主键。 数据库与数据表设计全文共28页,当前为第10页。 点击文件,选择保存,并命名表 数据库与数据表设计全文共28页,当前为第11页。 说明 在创建数据表前,首先要根据项目实际要求制定相关的表结构,然后在数据库中创建相应的数据表。 数据库与数据表设计全文共28页,当前为第12页。 tb_UserPope(用户权限表):用于保存每个操作员使用程序的相关权限。 用户权限表 数据库与数据表设计全文共28页,当前为第13页。 tb_PopeModel(权限模块表):用于保存程序中所涉及的所有权限名称。 字段名 数据类型 主键否 描述 ID int 是 编号 PopeName Varchar(50) 否 权限名称 权限模块表 数据库与数据表设计全文共28页,当前为第14页。 tb_EmployeeGenre(职工类别表):用于保存职工类别的相关信息。 数据库与数据表设计全文共28页,当前为第15页。 tb_Staffbasic(职工基本信息表):用于保存职工的基本信息。 职工基本信息表 数据库与数据表设计全文共28页,当前为第16页。 tb_Family(家庭关系表):用于保存家庭关系的相关信息 数据库与数据表设计全文共28页,当前为第17页。 Tb_WorkResume(工作简历表):用于保存工作简历的相关信息。 数据库与数据表设计全文共28页,当前为第18页。 Tb_RANDP(奖惩表):用于保存职工奖惩记录的信息。 数据库与数据表设计全文共28页,当前为第19页。 tb_Individual(个人简历表):保存职工个人简历的信息。 数据库与数据表设计全文共28页,当前为第20页。 说明 在设计数据表时,应在相应字段的说明部分对字段的用处进行相应的说明,以便于在对数据表进行操作,快速了解各字段的用处。 数据库与数据表设计全文共28页,当前为第21页。 Tb_DayWordPad(日常记事表):用于保存人事方面的一些日常事情。 数据库与数据表设计全文共28页,当前为第22页。 tb_TrainNote(培训记录表):保存致远培训记录的相关信息。 数据库与数据表设计全文共28页,当前为第23页。 tb_AddressBook(通讯录表):保存职员的其他联系信息。 字段符 数据类性 主键否 描述 ID Varchar(5) 是 编号 Name Varchar(20) 否 职工姓名 Sex Varchar(4) 否 性别 Phone Varchar(13) 否 家庭电话 QQ Varchar(15) 否 QQ号 WorkPhone Varchar(13) 否 工作电话 E—Mail Varchar(32) 否 邮箱地址 Handset Varchar(11) 否 手机号 数据库与数据表设计全文共28页,当前为第24页。 数据表逻辑关系 为了更好地理解职工信息信息表之间的关系,给出了数据表关系图。 通过关系图可以在相关联的表中获取指定的值,并通过职工基本信息表的ID值与家庭关系表、培训记录表、奖惩表等建立关系。 数据库与数据表设计全文共28页,当前为第25页。 职工基本信息表与各表之间的关系 数据库与数据表设计全文共28页,当前为第26页。 Thank you 数据库与数据表设计全文共28页,当前为第27页。 数据库与数据表设计

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值