Power Designer:数据库表设计工具
PowerDesigner是Sybase公司的一款软件,使用它可以方便地对系统进行分析设计,他几乎包括了数据库模型设计的全过程。利用PowerDesigner可以制作数据流程图、概念数据模型、物理数据模型、面向对象模型。今天的课程讲用Power Designer来做物理数据模型,即进行数据库表设计。
在项目设计阶段通常会使用PowerDesigner进行数据库设计。使用PowerDesigner可以更加直观的表现出数据库中表之间的关系,并且可以直接把设计好的表导出相应的建表语句。
1、Power Designer使用(创建PDM)
File-->new-->Physical Data Model-->给Model name起名pd_test-->DBMS中选择MYSQL5.0-->确定
快捷键:alt+0,显示左侧列表
Pd_test右键-->new-->table-->name是说明性的文字,真正的表名是通过code来看的,两个一样也可以。给name取值为“用户表”,给code取值为“t_user” -->Columns-->添加字段,如果是主键则勾选P(primary key),varchar类型要指定长度,varchar类型选择varchar(%n),,如果长度是11,则在length那一列填11,此时Data_type类型由varchar(0)变为varchar(11),int和Integer类型不用指定长度,name那一列写中文名,code那一列写字段名,-->设置主键自增:选中主键那一行,右键,选择properties,点击是,勾选Identity,它表示主键自增,点击应用,点击确定-->点击确定,这样就创建出一个用户表
注意:如果不添加主键自增,将sql语句导入数据库之后,要在设计表的时候,勾选“自动递增”
快速创建表:在palette中点击,单击空白屏幕,双击表,修改表的信息。
添加外键约束:在t_order表中添加外键字段user_id,-->在palette中点击,再单击订单表,按住不放拖动到用户表,但是此时外键加到id上了-->双击中间连接的箭头-->点击Joins-->将子表的外键列由id修改为user_id-->确定,这样user_id就变成了外键
2、Power Designer使用(导出SQL脚本)
点击保存,可以保存为pdm文件,保存之后,双击该文件就可以打开powerDesigner
DataBase-->Generate DataBase-->Directory选C:\Users\ASUS\Desktop,File name选health_test-->确定-->close-->关闭Result list,此时桌面上已经生成sql文件-->打开Navicat的health数据库-->将生成的sql文件拖动到health的白色区域-->点击开始-->关闭-->在空白区域点击右键,选择刷新,发现数据库表就生成了。
3、Power Designer使用(逆向工程)
上面我们是首先创建PDM模型,然后通过PowerDesigner提供的功能导出SQL脚本。实际上这个过程也可以反过来,也就是我们可以通过SQL脚本逆向生成PDM模型,这称为逆向工程,操作如下:
File-->Reverse Engineer-->DataBase-->修改Model name为pd_2-->确定-->Selection-->add File-->选择health_test.sql文件-->打开-->确定
4、Power Designer使用(生成数据库报表文件)
通过PowerDesigner提供的功能,可以将PDM模型生成报表文件,
Report-->Report Wizard-->指定报表名称和语言Simplified Chinese-->next-->next-->next-->完成-->保存-->是,这时会生成htm文件,
5、使用Power Designer创建表格注意事项:
1)、int和Integer类型不用指定长度。varchar类型要指定长度,varchar类型选择varchar(%n)。
2)、mysql数据库表字段命名规范:
(1)采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔
(2)全部小写命名,禁止出现大写
(3)字段必须填写描述信息
(4)禁止使用数据库关键字,如:time ,datetime, password 等
(5)字段名称一般采用名词或动宾短语。动宾短语示例:is_friend is_good,名词 示例:user_id user_name sex
(6)采用字段的名称必须是易于理解,一般不超过三个英文单词
(7)在命名表的列时,不要重复表的名称。例如,在名employe的表中避免使用名为employee_lastname的字段
(8)不要在列的名称中包含数据类型
(9)字段命名使用完整名称,禁止缩写
待优化命名示例
①大小写规则不统一
错误示例:user_id houseID
说明:使用统一规则,修改为”user_id”,”house_id”
②加下划线规则不统一
错误示例:username userid isfriend isgood
说明:使用下划线进行分类,提升可性,方便管理,修改为”user_name”,”user_id”,”is_friend”,”is_good”
③字段表示不明确
错误示例:uid pid
说明:使用完整名称,提高可读性,修改为”user_id”,”person_id”
3)、字段类型规范
(1)所有字段在设计时,除以下数据类型timestamp、image、datetime、smalldatetime、uniqueidentifier、binary、sql_variant、binary 、varbinary外,必须有默认值,字符型的默认值为一个空字符值串’’,数值型的默认值为数值0,逻辑型的默认值为数值0
(2)系统中所有逻辑型中数值0表示为“假”,数值1表示为“真”,datetime、smalldatetime类型的字段没有默认值,必须为NULL
(3)用尽量少的存储空间来存储一个字段的数据。使用int就不要使用varchar、char,如手机号用int类型(数据库设计过程中尽量使用int来作为字段类型,因为在所有的数据类型中int不管是存储空间还是执行速度方面都是最好的。例如:如果业务中存储的都是数据的话而且长度不是特别长的话,就可以考虑使用int来进行存储,或者业务中要对数据进行排序的时候需要使用某一标识权重之类的,也可以使用int来进行存储。但是不要因为int高效,而有意识的把所有字段都设计成int来处理,最终还是要根据业务的具体需求来设计相应的字段。当数据存储的是字符,且长度是一个固定区间定值的话就可以考虑使用char来进行存储,如果字符长度是未知的且长度变化特别明显的话,这个时候最好使用varchar来存储,如性别最好用char(1),当然也可以用varchar(1),建议'1'=男,'2'=女,''或者其他就是未知,小于10位且长度基本固定的字符串用char,长度大于10的用varchar,varcha在10以内占用空间比char大。char c='a'在内存中确实只占1字节,但这不意味着String s="abc"在内存中只占3字节。应该这么说,String s="abc"至少在内存中占3字节。这是因为char是基本数据类型,而String确是对象类型。对象是一种很复杂的数据类型,你要看一个对象具体占多少字节,可以把这个对象序列化后存入一个文本文件来看它具体占用了多少字节,当然这也不是精确的,因为序列化需要写入少量系统信息,但大致是对的。varchar(10)和char(10)的差别是什么?存储超过时候会发生什么问题呢?这个问题其实也相对经典,我也是整了很久才搞清楚的。在MYSQL5,5以后,varchar(x)x中范其实是存储字段的长度范围,就是一个字符代表一个长度,不管这个字符是汉子还是字符都算是一个长度单位。varchar虽然设置长度值,可是因为varchar是可变的长度类型,也就是当存储的长度小于x时候,其实实际的存储空间不是x而是实际存储的字符长度+一些标示空间。当然如果超过x的长度的话还是会报错的。而char(y)中y的值就是存储空间实际的存储长度,超过这个长度的话就会报错)。用varchar(16)就不要使varchar(256);IP地址使用int类型;固定长度的类型最好使用char,例如:邮编(postcode);能使用tinyint就不要使用smallint,int(tinyint存储大小为一个字节,smallint存储大小为2个字节,int存储大小为4个字节,年龄用tinyint就足够了,tinyint可以表示0~255,用int就浪费了三倍空间。从性能的角度来说,用int会更好点,(int是4字节,刚好是计算机的字长)。从空间的利用上,是该用tinyint,只是,现在的空间不值钱,一般很少会考虑到这个需求了。个人觉得最好用tinyint);最好给每个字段一个默认值,最好不能为null
(4)用合适的字段类型节约空间。如:字符转化为数字(能转化的最好转化,同样节约空间、提高查询性能)。避免使用NULL字段(NULL字段很难查询优化、NULL字段的索引需要额外空间、NULL字段的复合索引无效)。少用text类型(尽量使用varchar代替text字段)
(5)、在涉及到金额的时候如果对精度要求不高的情况下可以优先使用float,其次是使用double来进存储。如果对精度要求比较高的情况下最好使用decimal来存储,但是相应的它 的效率没有float和double那么高效。具体使用哪种还是要根据业务的具体需求来选择。
(6)、关于date和datetime的用法,就要看你想要存储时间的精确值了,如果仅仅是想要精确到天的话使用date就可以了(如mysql中出生日期使用date类型),如要要精确到秒一级别的就要使用datetime了。有时候大家使用datetime的使用却只是存储到天的日期单位时,这个时候就会自动添加00:00:00在数据的后面,作为秒一级别的数据。
(7)、int(5)和int(10)的区别是什么?想必大家也很好奇吧,其实5和10其实只是显示长度的却别而已,也就是不管int(x)x的值是什么值,存储数字的取值范围还是int本身数据类型的取值范围,x只是数据显示的长度而已。
4)、数据库中每个字段的规范描述
(1)尽量遵守第三范式的标准(3NF)。表内的每一个值只能被表达一次;表内的每一行都应当被唯一的标示;表内不应该存储依赖于其他键的非键信息
(2)如果字段事实上是与其它表的关键字相关联而未设计为外键引用,需建索引
(3)如果字段与其它表的字段相关联,需建索引
(4)如果字段需做模糊查询之外的条件查询,需建索引
(5)除了主关键字允许建立簇索引外,其它字段所建索引必须为非簇索引
5)、数据库命名规范。采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔,如:tb_freight_template
一个项目一个数据库,多个项目慎用同一个数据库