3.1 数据库对象和模式;
数据库对象是数据库中国定义的用于存储或引用数据的对象,比如表、视图、簇、序列、索引和异名。
3.2 表:数据的主要存储方式
表是关系型数据库中的最主要的数据存储对象,其最简单的形式是由行和列组成,行和列都分别包含数据。表在数据库占据实际的物理空间,可以是永久的或是临时的。
3.2.1 列
一般使用下划线作为分隔符例如:CUSTOMER_NAME,而不使用”-”;
列也可以指定为null和not null,null并不是指没有数据而是一个空字符串,同理not null。
3.2.2 行
表中最少包含一条记录;
3.2.3 CREATE TABLE语句
Create table语句用于创建表,在创建表时需要考虑以下一些基本问题。
- 表中包含什么类型的数据?
解答:表中数据类型:字符串类型(定长字符串、变长字符串)、数值类型、日期和时间类型
- 表的名称是什么?
解答:1)表名一般以【模块名称_具体表名】来实现;2)表名称不应该取太长,一般不超过三个英文单词,不推荐使用中文拼音,总的长度不要超过30个字符;3)不使用tab或tb作为表前缀;4)一些使用多对多连接的表,可以使用两个表的前缀作为表名,如:用户登录表User_Login,用户分组表User_GroupInfo,这两个表建立多对多关系表名为:User_Group_Relation(关系统一用relation);5)当系统中有一些少量的,重复出现的值时,使用字典表来节约存储空间和优化查询。如地区等,这类值不会在程序的运行期变化,但是需要存储在数据库中。一般数据库中,都有一个数据字典表,用来保存系统所用的基础数据,大型的字段表如省份城市区域的字典表,统一以Dictionary_作为前缀。6)使用单数形式表示名称;7)数据库中应建立一个表,就是数据库本身的字段信息,表的说明,也就是数据库设计文档的一个表;8)每个表都应该有一个主键,这个主键最好是数字,而且是递增的,有很多表的主键用32位字符编码,这样做的目的更多的是从安全考虑的。9)操作日志表,登录日志表,这是数据库中必备的两个表。操作日志表:Sys_OperateLog、登录日志表Sys_LoginLog、系统字典表Sys_Dictionry、系统字典表类型Sys_DicType。
操作日志表Sys_OperateLog:
中文名 | 字段名 | 注释 |
操作日志编码 | OL_ID | 索引列,日志的编号 |
操作类型 | OL_Type | 添加、修改、删除、查询等内容(可放在通用字典表) |
操作模块 | OL_Module | 操作模块,比如新闻模块关联的是菜单表编号 |
操作内容 | OL_Content | 操作了什么内容,越具体越好(修改前、修改后) |
操作人 | UI_ID | 用户的信息 |
操作时间 | OL_AddDate | 日志记录创建时间 |
操作IP | OL_IP | 操作人的IP地址 |
备注信息 | OL_Remarks | 备注信息,一些其它的需要说明的信息 |
登录日志表Sys_LoginLog:
中文名 | 字段名 | 注释 |
登录日志编号 | LL_ID | 登录的日志编号 |
登录人 | UI_ID | 登录人 |
登录时间 | LL_AddDate | 登录时间 |
登录IP | LL_IP | 登录的IP地址 |
登录状态 | LL_Status | 登录是否成功的标识 |
登录浏览器 | LL_Broeser | 登录浏览器 |
登录分辨率 | LL_Resolution | 登录的屏幕分辨率 |
系统字典表Sys_Dictionary:
中文名 | 字段名 | 注释 |
字典编号 | SD_ID | 字典的编号,可以直接使用此主键的编码(注意删除时的关联关系) |
字典类型 | DY_ID | 字典类型的ID,需要建立字典类型表,因为放的是所有的字典表 |
字典编码 | SD_Code | 字典编码,支持自己编码(同一类型是唯一的,一般是整数型) |
字典中文名称 | SD_Name | 字典中文名称(比如男女,比如状态,可以放到字典里,作为查看依据) |
字典备注 | SD_Remarks | 字典备注,字典需要一些备注信息 |
创建人 | ||
创建日期 | ||
修改人 | ||
修改日期 |
3.数据字典
数据字典分为两种方式:
1)把主体的属性代码放入独立的表中,不是和主题放一起,主体中只保留属性的代码。这里属性的数量是不变的,这里属性的数量是不变的,而属性取值的数量可以是变化的。
例如:
《职员表》
姓名 | 证件 | 性别 |
张三 | 身份证 | 女 |
李四 | 身份证 | 男 |
使用了数据字典后:
《职员表》
姓名 | 证件 | 性别 |
张三 | 001 | 女 |
李四 | 001 | 男 |
另外增加了《证件表》
《证件表》
证件id | 证件名 |
001 | 身份证 |
002 | 暂住证 |
这个证件表就是一种数据字典。要改变证件名称时,只要把其中的“身份证”改成“居民身份证”就可以了。
但第一种也有局限性。使用第一种数据字典后,程序员除“职员”类外,还就需要有一个“国籍”类、一个“证件”类和一个“学历”类,对应的数据库中也需要增加一张“学历”表。“职员”类则需要包含一个对“国籍”类的引用,一个对“证件”类的引用,对应的数据库中“职员”表中也需要三个外键分别指向国籍表、证件表、和学历表。这样的设计在类似国籍和学历这样的属性比较少时时可行的,但是随着系统复制性的增加,系统中会出现大量结构类似的信息表,数量一直会增加到一个不饿接受的地步。
2)用一个表放结构相同的所有属性信息,不同属性的不同取值统一编码,用类型来区分不同的属性,主体中保留属性代码的列表。这样主体所拥有的属性数量就是可变的了。第二种数据字典比第一种更抽象,层级更高,也更具一般性、通用性。
还是以上面的例子为例。在系统中去掉《国籍表》、《证件表》、《学历表》等,引入《系统代码分类表》和《系统代码表》
《系统代码分类表》
分类标识 | 分类名称 |
country | 国籍 |
Id | 证件 |
《系统代码表》
标识 | 分类 | 内容 |
001 | country | 中国 |
002 | country | 美国 |
003 | ID | 身份证 |
004 | ID | 暂住证 |
对于《职员表》,使用第一种数据字典时,其结构时:职员表、姓名、国籍ID、证件ID、学历ID...
采用第二种数据字典后,其表结构是:职员ID、姓名另外增加属性表,该表是《职员表》和《系统代码表》的关系表,其表结构是:属性ID、职员ID、系统代码表_标识
如:
《职员表》
职员ID | 姓名 |
1 | 张三 |
2 | 李四 |
《属性表》
属性ID | 职员ID | 系统代码表标识 |
1 | 1 | 001(表示张三是中国籍) |
2 | 1 | 501(表示张三的证件是身份证) |
3 | 2 | 002(表示李四是美国籍) |
4 | 2 | 501(表示李四的证件是身份证) |
- 哪个(或哪些)列组成主键?
- 列的名称是什么?
- 每一列的数据类型是什么?
- 每一列的长度是多少?
- 表中哪些列可以是null?
注意:不同的系统往往有不同的命名规则
在命名对象和其它数据库元素时,一定要查看具体实现的规则。数据库管理员通常会采用某种“命名规范”来决定如何命名数据库中的对象,以便区分它们的用途。
创建表的语法如下:
Create table table_name
(field1 data_type [ not null ],
field2 data_type [ not null ],
Field3 data_type[ not null ] );
下述代码同时适用于 Microsoft SQL Server 和 Oracle;
Create table employee_tbl
(EMP_ID varchar (9) not null,
EMP_NAME varchar (40) not null,
EMP_ST_ADDR varchar (20) not null,
EMP_CITY varchar (15) not null,
EMP_ST varchar (2) not null,
EMP_ZIP integer not null,
EMP_PHONE integer null,
EMP_PAGER integer null);
这个表包含8列。列的名称使用下划线进行分隔,使其看起来像是独立的单词(EMPLOYEE ID 被存储为EMP_ID),这种方式可以使表和列具有更好的可读性。
3.2.4 命名规范
表的列和表命名若多个英文单词中间用“_”表示;