文章目录
- 数据类型
- 字段属性
- 存储引擎
- 字符集
- 创建新表
- 数据库建模
- PowerDesigner 建模工具
数据类型
数据类型 - 日期和时间类型
https://www.runoob.com/mysql/mysql-data-types.html
年 year
月 month
日 day
小时 hour
分钟 minute
秒 second
timestamp --> 时间戳:距离1970-1-1 0:0:0为起点 有多少秒 格林尼治时间
1970-01-01 00:00:00/2038 到2038年存放不了;4个字节
root@sanchuang mysql>create table t7(name varchar(20),birthday date,check_sc timestamp);
root@sanchuang mysql>desc t7;
+----------+-------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+-------------------+-----------------------------+
| name | varchar(20) | YES | | NULL | |
| birthday | date | YES | | NULL | |
| check_sc | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+----------+-------------+------+-----+-------------------+-----------------------------+
3 rows in set (0.00 sec)
root@sanchuang mysql>insert into t7(name,birthday,check_sc) values('cali','1984-10-01',now());
root@sanchuang mysql>select * from t7;
+------+------------+---------------------+
| name | birthday | check_sc |
+------+------------+---------------------+
| cali | 1984-10-01 | 2021-02-15 14:40:52 |
+------+------------+---------------------+
1 row in set (0.00 sec)
root@sanchuang mysql>insert into t7(name,birthday,check_sc) values('rose','1984-10-01','2038-1-1 12:22:22');
#示例:now()函数 获取当前时间
root@(none) mysql>select now();
字符串类型
https://www.runoob.com/mysql/mysql-data-types.html
字符串
char
varchar
text
blob 二进制的文本
tinyblob
MEDIUMBLOB
LONGBLOB
blob
enum 枚举
set 集合
binary和varbinary
一个英文字母占1个字节
1个汉字,如果是utf8编码,占3个字节
root@sanchuang mysql>select name,length(name),char_length(name) from t8;
+-----------+--------------+-------------------+
| name | length(name) | char_length(name) |
+-----------+--------------+-------------------+
| feng | 4 | 4 |
| 冯德勇 | 9 | 3 |
+-----------+--------------+-------------------+
2 rows in set (0.00 sec)
length(name)统计字符串的存储的字节数
char_length(name)统计的是字符的个数
char和varchar有什么区别?
存储方式
char 固定长度的字符串类型 character 字符 --> 在存储的时候,不够固定长度,就在前面填充空格,达到固定长度
'feng' 但是我的表结构里的长度是30,在存储feng字符串的时候,会在前面填充26个空格来达到30个字符的长度
varchar 可变长的字符串类型 variable character
'feng' 我的表结构里的长度是30,但是只是存储feng这4个字符,不填充空格
char比varchar在长度没有达到规定的时候,更加消除磁盘空间些。如果达到了规定长度,varchar要比char多一个字节的存储空间
虽然VARCHAR数据类型可以节省存储空间,提高数据处理的效率。但是其可变长度带来的一些负面效应,有时候会抵消其带来的优势。
char存储定长数据很方便,char字段上的索引效率很高。
长度方面
char 最大长度255 varchar 最大长度是65,535
检索的方式不同
一个长度CHAR列被固定在创建表声明的长度。长度可以是0到255之间的任何值。CHAR 存储值时,将在它们的右边填充空格以达到指定的长度。当CHAR被检索到的值,拖尾的空格被删除
Value | CHAR(4) | Storage Required | VARCHAR(4) | Storage Required |
‘’ | ’ ’ | 4 bytes | ‘’ | 1 byte |
‘ab’ | 'ab ’ | 4 bytes | ‘ab’ | 3 bytes |
‘abcd’ | ‘abcd’ | 4 bytes | ‘abcd’ | 5 bytes |
‘abcdefgh’ | ‘abcd’ | 4 bytes | ‘abcd’ | 5 bytes |
枚举类型 ENUM
CREATE TABLE shirts (
name VARCHAR(40),
size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
);
INSERT INTO shirts (name, size) VALUES ('dress shirt','large'), ('t-shirt','medium'), ('polo shirt','small');
SET类型
集合类型:插入数据的时候,必须是集合里有的内容,如果没有,就会报错,不能插入,而且插入重复的数据,只显示一个
root@sanchuang mysql>CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
root@sanchuang mysql>INSERT INTO myset (col) VALUES
-> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
root@sanchuang mysql>select * from myset;
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
5 rows in set (0.00 sec)
如何知道一张表的结构?
1 .desc t1
2 .show create table t1
创建表的语法
#示例:if not exists
如果要创建的表已经存在,强制不显示错误消息
root@sanchuang mysql>create table if not exists sanchuang.chenpeng(id int primary key,name varchar(10) not null);
root@sanchuang mysql>desc chenpeng;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(10) | NO | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
#示例:查看警告信息
root@sanchuang mysql>show warnings;
show命令汇总:
1 .show databases;
2 .show tables;
3 .show variables;
4 .show processlist; #注:查看哪些人链过来
5 .show create table t1
6 .show warnings;
字段属性
约束:对某个字段里的内容进行限制
添加数据类型选项
unsigned 无符号整数
signed 有符号整数
not null 不能为空
primary key 等同于not null+unique
主键 不允许为空,而且也不需要重复
zerofill 填充0
如果声明了zerofill,该列会自动设为unsigned
auto_increment 自增
default 默认值
comment 注释
sqlyog查看
存储引擎 engine
字符集
unique 唯一性
允许为null
foreign keys 外键
---------------------------------------------------------------------------------------------------------------------------------
#示例:zerofill 填充0
如果声明了zerofill,该列会自动设为unsigned
root@sanchuang mysql>create table zhangjie(id int(5) zerofill);
root@sanchuang mysql>desc zhangjie;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| id | int(5) unsigned zerofill | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
root@sanchuang mysql>insert into zhangjie(id) values(1),(12),(123);
root@sanchuang mysql>select * from zhangjie;
+-------+
| id |
+-------+
| 00001 |
| 00012 |
| 00123 |
+-------+
3 rows in set (0.00 sec)
---------------------------------------------------------------------------------------------------------------------------------
#示例:auto_increment 自增
int不指定长度 默认长度是11 有符号,放10位
root@sanchuang mysql>create table city_name(id int unsigned auto_increment primary key,name varchar(20) not null);
root@sanchuang mysql>desc city_name;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
root@sanchuang mysql>create table city_name2(id int auto_increment primary key,name varchar(20) not null);
root@sanchuang mysql>desc city_name2; #注:int不指定长度 默认长度是11,放10位
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
#注:存放电话号码 字段使用 字符串类型 varchar;不能用int类型
root@sanchuang mysql>create table city_name4(id int(20) auto_increment primary key,name varchar(20) not null);
root@sanchuang mysql>insert into city_name4(id,name) values(1,'cali');
root@sanchuang mysql>insert into city_name4(name) values('tom');
root@sanchuang mysql>insert into city_name4(name) values('jack');
root@sanchuang mysql>select * from city_name4;
+----+------+
| id | name |
+----+------+
| 1 | cali |
| 2 | tom |
| 3 | jack |
+----+------+
3 rows in set (0.00 sec)
---------------------------------------------------------------------------------------------------------------------------------
#示例:设置起始值 每次加几
root@sanchuang mysql>SET @@auto_increment_offset = 10, -- 起始值
-> @@auto_increment_increment=10; -- 每次加几
---------------------------------------------------------------------------------------------------------------------------------
#示例:定义变量
root@sanchuang mysql>set @sg='dengjizhou'; #注:定义变量sg赋值dengjizhou
root@sanchuang mysql>insert into city_name4(name) values(@sg); #注:引用sg的值插入到表里
---------------------------------------------------------------------------------------------------------------------------------
#示例:primary key 主键不允许重复
root@sanchuang mysql>insert into city_name4(id,name) values(7,'rose');
ERROR 1062 (23000): Duplicate entry '7' for key 'PRIMARY'
Duplicate 重复的
entry 条目(记录) --> 一行数据就是一个条目,也是一个记录
---------------------------------------------------------------------------------------------------------------------------------
#示例:default 默认值
列一旦定义了默认值,当插入一个新行到表中并且没有给该列明确赋值时,它将自动得到默认值
root@sanchuang mysql>create table stu1(id int primary key auto_increment,
-> name varchar(10) not null,
-> grade int(3) unsigned default 0
-> );
root@sanchuang mysql>insert into stu1(name,grade) values('cali',80);
root@sanchuang mysql>insert into stu1(name) values('dengjizhou');
---------------------------------------------------------------------------------------------------------------------------------
#示例:comment 注释
comment 用来给列/表 添加注释。最多255个字符。注释会保存到数据字典中
#示例:给列加注释
root@sanchuang mysql>create table stu2(id int primary key comment '编号',name varchar(20) not null comment '姓名');
#示例:给表加注释
root@sanchuang mysql>create table mycomm(
-> column_a int
-> ) comment '测试表';
#注:desc stu2;看不到comment 内动;show create table stu2;可以看见使用的语句
#注:select查询时也看不到啊comment
---------------------------------------------------------------------------------------------------------------------------------
#示例:unique 唯一性
root@sanchuang mysql>create table cPen3(id int(4) primary key,name varchar(10) unique);
root@sanchuang mysql>desc cPen3;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(4) | NO | PRI | NULL | |
| name | varchar(10) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
唯一性约束的可以有多个null值
索引:是一种数据,用来帮助查询,提升查询的速度。
主键索引
唯一索引
示例:foreign key 外键
外键的优势是什么? --> 作用是什么?
外键的好处:直接引用别的表里的字段,自己的表里就不需要再创建相同的数据了,可以避免数据的冗余
父子表:外键所在的表叫做子表,外键所引用的主键所在的表叫做父表
外键:其实在另外表里是主键
A表里的主键被引用到B表里做一个字段,这个字段就是B表里的外键
---------------------------------------------------------------------------------------------------------------------------------
#示例:foreign key 外键
创建父表 部门表
CREATE TABLE dept(
deptid INTEGER,
dname VARCHAR(20),
CONSTRAINT dept_deptid_pk PRIMARY KEY(deptid)
);
INSERT INTO dept(deptid,dname) VALUES(10,'市场部');
INSERT INTO dept(deptid,dname) VALUES(20,'销售部');
----------------------------------------------------------------------------
创建子表 员工表
CREATE TABLE emp(
id INTEGER,
NAME VARCHAR(20),
deptid INTEGER,
PRIMARY KEY(id),
FOREIGN KEY(deptid) REFERENCES dept(deptid)
);
INSERT INTO emp(id,NAME,deptid) VALUES(1,'张三',10);
INSERT INTO emp(id,NAME,deptid) VALUES(2,'李四',10);
----------------------------------------------------------------------------
外键查询
root@chenpeng4 mysql>select name,dname from dept,emp where dept.deptid = emp.deptid;
+--------+-----------+
| name | dname |
+--------+-----------+
| 张三 | 市场部 |
| 李四 | 市场部 |
| 王五 | dev |
+--------+-----------+
#注:一旦建立主外键后,主表和子表 都受到约束
#注:插入受外键约束
root@chenpeng2 mysql>INSERT INTO emp(id,NAME,deptid) VALUES(3,'李五',30);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
#注:删除受外键约束
root@chenpeng2 mysql>DELETE FROM dept WHERE deptid = 10;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails
ON DELETE CASCADE 级联删除。当删除当删除父表中的行时,如果子表中有依赖于被删除父行的子行存在,那么连同子行一起删除
ON DELETE SET NULL 当删除当删除父表中的行时,如果子表中有依赖于被删除父行的子行存在,那么不删除中,而是将子行的外键列设置为null
CREATE TABLE emp(
id INTEGER,
NAME VARCHAR(20),
deptid INTEGER,
CONSTRAINT emp_id_pk PRIMARY KEY(id),
CONSTRAINT emp_deptid_fk FOREIGN KEY(deptid) REFERENCES dept(deptid)
ON DELETE SET NULL
);
information_schema:相当于是mysql里的统计局(中央情报局) --> 里面存放的是MySQL运行起来后内部的可以查询的数据 --> MySQL内部管理需要的信息
information_schema.TABLE_CONSTRAINTS --> 存放数据字典的库 --> 对mysql进程的正常运转提供依据。
#示例:2种设置主键方法
1 .primary key直接放到后面作为属性
2 .使用函数primary key()
root@sanchuang mysql>create table stu2(id int primary key comment '编号',name varchar(20) not null comment '姓名');
root@sanchuang mysql>create table stu3(id int comment '编号',name varchar(20) not null comment '姓名',primary key(id));
存储引擎
什么是存储引擎?
mysql里用来存取数据的一个模块,负责将mysql在内存里的数据写到磁盘,同时也负责将磁盘的里数据读取到内存。
有哪些存储引擎?
InnoDB MyISAM MEMORY BLACKHOLE CSV
存储引擎和表绑定
memory 数据保存在内存里,特别适用于适用临时表的场景
csv CSV storage engine
以逗号作为分割的文件
数据分析 数据处理
blackhole
解决了主从复制架构里,让很多的从服务器直接到配置了blackhole存储引擎的master上拿二进制日志,让最上层的master的负载降低
其实就是帮忙主从架构传递二进制日志,自己不执行二进制日志,只是传递
#注:MEMORY存储引擎的特点:尽可能把数据保存到内存当中,不写在内存里。特别适用于临时表。方向:大数据分析、统计;临时使用表,只需要结果
#示例:创建临时表
root@sanchuang 13:19 mysql>create temporary table chenpeng(id int);
root@sanchuang 13:20 mysql>insert into chenpeng(id) values(1);
#注:show tables;查看不了。其他用户登录 查看不到。每个人连过来会产生一个会话,操作时产生一堆事务,事务隔离,落盘到磁盘。临时表只在内存中,不落盘,不持久化(内存到磁盘,不丢失)
blackhole存储引擎 适用场景
在主从之间添加一个分布式master,配置blackhole存储引擎,他起到一个中继的作用,他接收数据但丢其他而不是存储,只是会把master的二进制日志供下层的slave来读取。
blackhole存储引擎的特点:
解决了主从复制架构里,让很多的从服务器直接到配置了blackhole存储引擎的master上拿二进制日志,让最上层的master的负载降低
其实就是帮忙主从架构传递二进制日志,自己不执行二进制日志,只是传递
Supports transactions, row-level locking, and foreign keys
InnoDB特点:
事务:transactions
行锁:row-level locking 给表里的一行数据加锁
外键:foreign keys
#注:事务 解决大并发情况下数据不乱的问题
memory存储引擎 数据保存在内存里,特别适用于适用临时表的场景
csv存储引擎
CSV storage engine
以逗号作为分割的文件
数据分析 数据处理
[root@mysql_compile log]# cat /etc/passwd|awk -F: 'BEGIN{OFS=",";print "username,uid,gid,shell"}{print $1,$3,$4,$7}' >user.csv
[root@mysql_compile log]# cat user.csv
username,uid,gid,shell
root,0,0,/bin/bash
bin,1,1,/sbin/nologin
BEGIN{命令} 是awk命令首先执行的命令,而且只是执行一次
OFS="," 指定输出分隔符,默认是空格
; 命令连接符号
BEGIN{命令} 最后执行
print "username,uid,gid,shell" 输出字符串
show create table stu2; 可以查看使用哪种存储引擎
show engines; 查看有哪些存储引擎 和 默认使用的存储引擎
字符集
示例:建表时指定字符集
root@sanchuang mysql>create table t11(id int(10) primary key auto_increment,name varchar(20) not null default 'jack') default charset='utf8';
示例:建库时指定字符集
root@(none) mysql>create databases cPen2 default charset='utf8';
root@(none) mysql>show create database cPen2;
utf8编码:
1个英文字母占1个字节
1个汉字占3个字节
字符集会继承
库 --> 表 --> 字段
创建表的时候,varchar和char、text文本的数据类型 --> 可以去指定列的字段类型
列对应的字段的字符集优先级最高
rpm方式安装的mysql默认的字符集是latin1
编译安装的时候因为指定了字符集为utf8,所以默认的字符集是utf8
COLLATION 校对规则、排序规则
utf8_general_ci case ignore --> 排序的时候,不区分大小写
---------------------------------------------------------------------------------------------------------------------------------
#示例:查看mysql里支持哪些字符集
root@sanchuang mysql>show character set;
#示例:查看当前正在用哪些字符集
root@sanchuang mysql>show variables like '%char%';
---------------------------------------------------------------------------------------------------------------------------------
#示例:length(),char_length()
root@sanchuang mysql>select name,length(name),char_length(name) from t8;
length(name)统计字符串的存储的字节数
char_length(name)统计的是字符的个数
字符集会继承
库 --> 表 --> 字段
#示例:知道表的字符集
root@sanchuang mysql>show create table stu_info;
#示例:知道库的字符集
root@(none) mysql>show create database cPen;
+----------+-----------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------+
| cPen | CREATE DATABASE `cPen` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+-----------------------------------------------------------------+
1 row in set (0.19 sec)
#示例:查看mysql版本
[root@mysql_rpm ~]# mysql -V
创建新表
如何根据一个已经存在的表去创建一个新的表,表结构和数据都一模一样?
语法1:CREATE TABLE new_tbl LIKE orig_tbl;
这种语法,将从源表复制列名、数据类型、大小、非空约束以及索引。而表的内容以及其它约束不会复制,新表是一张空表。
例:
CREATE TABLE copy_teams LIKE teams;
语法2:CREATE TABLE new_tbl [AS] SELECT {*|column,...} FROM orig_tbl;
新表的结构由select列表决定。同时把查询返回的结果集中的行插入到目标表中。这种语法同样只能把非空约束带入到新表中。也不会复制索引 (主键、外键等)
例:
CREATE TABLE copy_teams2
AS SELECT * FROM teams;
#示例:根据已有的表来创建新表
root@chenpeng4 mysql>create table new_student like student;
root@chenpeng4 mysql>create table student2 as select * from student;
#示例:创建teams表的一个临时副本,并且给这个表分配相同的名字
root@chenpeng4 mysql>create temporary table teams
-> as select * from teams;
好处:临时使用,用户一断开连接,临时表的空间就会释放
#示例:去掉表中重复数据 (去重) --> 赋给新的临时表
root@chenpeng4 mysql>select distinct * from student2;
root@chenpeng4 mysql>create temporary table temp_student as select distinct * from student2;
数据库建模
设计数据模型
===============================================================================
原方案
===============================================================================
选课系统
学号 名字 班级 课程编号 名字 讲师 教室 学分 成绩
1 李三 某学院某专业某届几班 1 云计算 *** *** 4
1 李三 某学院某专业某届几班 2 *** *** *** *
1 李三 ***
名字、班级 大量重复数据
计算机与科学专业 计科专业 会选错 数据不统一
手机号 同个同学填多个
---------------------------------------------------------------------------------------------------------------------------------
问题
1 .大量的重复数据
2 .数据不统一
---------------------------------------------------------------------------------------------------------------------------------
问题
1 .统计一下计科专业选课情况 (有人填计算机用于计算科学)
2 .手机号码修改
3 .查看成绩,很多数据被迫看
===============================================================================
数据库系统最核心的保证
数据的一致性
===============================================================================
第二种方案
===============================================================================
表 -- 学生信息
学号 手机号
李三
---------------------------------------------------------------------------------------------------------------------------------
表 -- 课程信息
课程编号
---------------------------------------------------------------------------------------------------------------------------------
表 -- 讲师
---------------------------------------------------------------------------------------------------------------------------------
表 -- 教室
教室编号
---------------------------------------------------------------------------------------------------------------------------------
表 -- 专业
---------------------------------------------------------------------------------------------------------------------------------
表 -- 选课表
专业编号列 学号列 课程编号列 讲师编号列 教室编号 成绩
===============================================================================
使用第二种方案来设计一套系统,满足范式
假设不满足范式:数据冗余、表格很庞大(列非常多)
选课表
学生信息 课程信息 讲师 成绩
多个列来表示对象 --> 学生、课程、讲师 --> 把学生、课程、讲师 单独拿出来,建表
---------------------------------------------------------------------------------------------------------------------------------
学生表 专业表 教室表 课程表 讲师表 成绩表
---------------------------------------------------------------------------------------------------------------------------------
学生表
学号 名字 手机号 家庭住址 班级
家庭住址表 --> 一堆表 --> 多个列 (考虑业务需求)
省、市、县、乡镇、村
不拆的情况:山东省济南市什么区什么路 山东济南什么路 --> 地址准确,但是统计时是2个地方;系统拆出来很多 不便于将来统计
如果将来没有统计的需求,那么可以不拆
如果有统计的需求,需要拆
--> 省 市 地址(不细分、考虑业务需求)
班级 --> 单独拿一张表
学校 学院 届 班
以上是设计数据模型
PowerDesigner 建模工具
===============================================================================
步骤:create model -->
步骤:Categories --> Information --> Conceptual Data (概念数据) --> Model name:*** -->
即选择cdm
步骤:工作空间 --> 选课系统 --> Diagram_1 -->
Entity --> 拉过来
===============================================================================
entity
实体,一个实体就是一个表格、一个表
---------------------------------------------------------------------------------------------------------------------------------
表格
1 .表格名字
2 .列
---------------------------------------------------------------------------------------------------------------------------------
设计标准
1 .每一个表都有一个主键
2 .列值尽量不要为空
---------------------------------------------------------------------------------------------------------------------------------
学生信息
选课
学生信息 课程信息 讲师信息
步骤:Relationship(右边工具栏) --> 拖过来 1连3 3拖1 (效果:选课里 有3个信息)
---------------------------------------------------------------------------------------------------------------------------------
步骤:双击选课 --> Attributes
--> Name:成绩 Num 5 2
---------------------------------------------------------------------------------------------------------------------------------
步骤:双击学生信息 --> Attributes
--> Name:学号 Num 10 P (唯一标识列 primary key) --> 每一个学号代表一个学生
--> Name:名字 Varchar 20 M (必填、不能为空)
--> Name:性别 Varchar 1 M
--> Name:手机号码 Num 10 M
--> Name:专业 看是否有统计需求,判断是否有
---------------------------------------------------------------------------------------------------------------------------------
步骤:添加entity 专业信息
--> Relationship 连过来 --> 学生信息
效果:学生信息里就有专业信息了
步骤:添加entity 省份信息
--> 同上Relationship --> 学生信息
步骤:添加entity 地级市信息信息
--> 同上Relationship --> 学生信息
#注:relationship A需要有B的信息,B拖到A这边来
---------------------------------------------------------------------------------------------------------------------------------
步骤:双击学生信息 --> Attributes
--Name:具体地址 Varchar 100 M
===============================================================================
省份信息
步骤:
省份信息
省份编号 Num 6 P
省份名字 Varchar 50 M
---------------------------------------------------------------------------------------------------------------------------------
地级市信息
步骤:
地级市信息
地级市编号 Num 6 P
地级市名字 Varchar 100 M
===============================================================================
专业信息
步骤:
专业信息
专业编号 Num 10 P
专业名字 Varchar 100 M
===============================================================================
课程信息
步骤:
课程信息
课程编号 Num 10 P
课程名字 Varchar 100 M
===============================================================================
讲师信息
步骤:
讲师信息
讲师编号 Num 10 P
讲师名字 Varchar 100 M
讲师手机号码 Num 11 M
###############################################################################
步骤:将系统部署到MySQL数据库上
上面菜单栏 --> 工具 (第2个) --> Generate Physical Data Model
--> DMS: MySQL 5.0 (选中) --> 确定
结果:报警 缺少identifiers enitity’选课’ 不管它 --> 生成了
原来的是cdm;生成的新的文件是 pdm
###############################################################################
步骤
双击 新生成的 Diagram_1 (pdm文件)
选课 --> Columns -->
学号、讲师编号、课程编号 P (3个合起来作为主键) --> 把刚才的警报解决了
--> 唯一标识:一个学生选某个老师的某门课 只能选一个
###############################################################################
步骤
上面的菜单栏 数据库 --> Generate Database 选中
DBMS: MySQL 5.0 --> 确定
--> 选课.sql脚本 --> edit 里面的内容 是SQL语句
将来把这些语句往数据库里一跑,表就全出来了 --> 设计完以后 直接可以用
工具好处:设计系统时,不需要考虑建表语句,画图就出来了
PowerDesigner建模工具
宿舍管理系统
列需求
需求分析 --> 设计
使用者
1 .宿舍管理员
2 .学生
功能的分析
宿舍管理员
1 .学生信息的录入和维护 --> 为了满足这个功能,需要设计那些表格?
学生信息(数据库方面) ;Java工程师 需要写很多页面:查询、录入、更改
考虑:为了满足这个功能,只需要在数据库里存什么
2 .物品信息的录入和维护
物品信息
3 .物品的发放
物品发放登记表
考虑:为了满足这个功能,只需要在数据库里存什么
4 .物品的回收
物品回收登记表
5 .物品的维修
物品维修记录表
6 .卫生检查信息的录入和维护
卫生检查信息记录表
7 .值班信息的录入和维护
值班信息记录表
8 .宿舍管理员信息的维护和录入 / 宿舍管理员注册、登录
宿舍管理员信息
计算机系统 是用来办公的,存到数据库里面去 (无纸化办公)
学生
1 .学生信息的(注册和)登录:用户名就是本人的学号,密码就是身份证最后6位
2 .学生领用物品的查询和申请
3 .学生报修物品
学校拨款100万 --> 建设宿舍管理系统 (需求) --> 设计者 (程序员)
===============================================================================
步骤1:买2台服务器 (硬件) --> 装操作系统Linux
数据库服务器 (database server)
应用服务器 (application server)
应用服务器的软件 tomcat weblogic jboss websphere
tomcat
应用服务器 6~10万
数据库服务器 10~15万
数据库服务器 (database server) Linux --> 装数据库软件 mysql
基础架构搭了
===============================================================================
步骤2:请2个工程师
数据库工程师:做好需求分析,使用PowerDesigner设计一套数据库系统,然后部署到MySQL里面去
本质:建一堆表
Java工程师:写类似网站的东西 Java代码,程序部署到tomcat上面去
网络工程师:中间应用服务器和数据库服务器 需要通过网络连接起来。买几台交换机、路由器
===============================================================================
应用服务器
Java代码
Tomcat (应用服务器软件 software)
Linux
Hardware 硬件
数据库服务器
表 --> 录入/查询
Mysql
Linux
Hardware
宿舍管理员 --> 通过电脑 打开网站 --> 弹出窗口 注册、登录 --> 登录后 打开页面;小按钮,各种窗口 --> 学生信息录入 --> 提交 --> 录入的学生信息存到表里去 (对数据库的操作:管理员通过应用程序去操作表)
--> 查询 --> 把数据从表中取出来 --> 通过Java展示
Java工程师的Java代码做的事:
1 .展现窗口 (提供友好界面) --> 导航作用
2 .把信息存入数据库
3 .把信息从数据库里取出
4 .修改数据库里的表