• MySQL数据库之基本概念与设置及数据库设计


    数据库基本概念

    数据库 表相关

    • 数据库:数据库中存放的是表,一个数据库中可以存放多个表

    • 表:表是用来存放数据的

    • 关系:两个表的公共字段

    • 行:也称记录,也称实体

    • 列:也称字段,也称属性

    • 理解

      • 就表结构而言,表分为行和列
      • 就表数据而言,表分为记录和字段
      • 就面向对象而言,一个记录就是一个实体,一个字段就是一个属性

    数据相关

    • 数据冗余:相同的数据存储在不同的地方

      • 冗余只能减少,不能杜绝
      • 减少冗余的方法是分表
    • 数据完整性:正确性+准确性=数据完整性

      • 正确性:数据类型正确
      • 准确性:数据范围要准确

    数据库执行过程

    • 客户端
      • 连接数据库
      • 发送SQL指令
      • 返回结果
      • 发送SQL指令
      • 返回结果
      • 关闭连接
    • MySQL

    MySQL数据库的目录

    • 数据库保存的路径在安装MySQL的时候就配置好

    • 在my.ini配置文件中更改数据库的保存地址

      • datadir="F:/wamp/PHPTutorial/MySQL/data/"
    • 一个数据库就对应一个文件夹,在文件夹中有一个db.opt文件

      • 在此文件中设置数据库的字符集和校对集

    MySQL数据库报错

    • 如果创建的数据库已存在,会报错

      • 创建数据库的时候判断一下数据库是否存在,如果不存在再创建
    • 如果数据库名是关键字和特殊字符,要报错

      • 在特殊字符、关键字行加上反引号
    • 创建数据库的时候可以指定字符编码

      • 创建数据库如果不指定字符编码,默认和MySQL服务器的字符编码是一致的

    SQL注释

    • 单行注释

      • -- 单行注释
      • # 单行注释
    • 多行注释

      • /* 多行注释 */

    连接服务器

    • 浏览器键入

      • http://localhost/phpmyadmin/index.php
    • 客户端

      • MySQL Workbench
    • 命令行接入

      • XAMPP中 Shell面板
      • 命令行名词
        • host -h 主机
        • port -p 端口号
        • user -u 用户名
        • password -p 密码
      • 连接数据库
        • mysql -h127.0.0.1 -P3306 -uroot -proot 明文
        • mysql -uroot -proot 明文 (本地数据库 端口号3306)
        • mysql -uroot -p 密文
      • 退出登录
        • exit
        • quit
        • q

    编码设置

    • 语法
      • set names gbk; 一次性设置客户端和服务器通讯的编码
      • set character_set_client=gbk; 更改接受客户端指令的编码
      • 设置什么编码取决于客户端的编码

    校对集

    • 语法
      • collate=utf8_general_ci; 不区分大小写
      • collate=utf8_bin; 按二进制编码比较,区别大小写
    mysql> create table stu1(
        -> name char(1)
        -> )charset=utf8 collate=utf8_general_ci;
    # `Query OK, 0 rows affected (0.05 sec)`
    
    mysql> create table stu2(
        -> name char(1)
        -> )charset=utf8 collate=utf8_bin;
    # `Query OK, 0 rows affected (0.05 sec)`
    
    mysql> insert into stu1 values ('a'),('B');
    # `Query OK, 2 rows affected (0.00 sec)`
    # `Records: 2  Duplicates: 0  Warnings: 0`
    
    mysql> insert into stu2 values ('a'),('B');
    # `Query OK, 2 rows affected (0.00 sec)`
    # `Records: 2  Duplicates: 0  Warnings: 0`
    

    数据库设计

    实体之间的关系

    • 一对多(1:N)

      • 主表中的一条记录对应从表中的多条记录
      • 实现一对多的方式
        • 主键和非主键建关系
    • 多对一(N:1)

      • 多对一就是一对多
    • 一对一(1:1)

      • 如何实现一对一
        • 主键和主键建关系
      • 一对一两个表完全可以用一个表实现,为什么还要分成两个表?
        • 表的垂直分割
          • 在字段数量很多情况下,数据量也就很大
          • 每次查询都需要检索大量数据,这样效率低下
          • 将所有字段分成两个部分,“常用字段”和“不常用字段”
          • 这样对大部分查询者来说效率提高了
    • 多对多(N:N)

      • 主表中的一条记录对应从表中的多条记录
      • 从表中的一条记录对应主表中的多条记录
      • 如何实现多对多
        • 利用第三张关系表
    • 小结

      • 如何实现一对一:主键和主键建关系
      • 如果实现一对多:主键和非主键建关系
      • 如何实现多对多:引入第三张关系表

    数据库设计

    • 数据库设计的步骤
      • 收集信息:与该系统有关人员进行交流、坐谈,充分理解数据库需要完成的任务
      • 标识对象(实体-Entity):标识数据库要管理的关键对象或实体
      • 标识每个实体的属性(Attribute)
      • 标识对象之间的关系(Relationship)
      • 将模型转换成数据库
      • 数据规范化

    第一步:收集信息

    • BBS论坛的基本功能
      • 用户注册和登录,后台数据库需要存放用户的注册信息和在线状态信息
      • 用户发贴,后台数据库需要存放贴子相关信息,如贴子内容、标题等
      • 用户可以对发帖进行回复
      • 论坛版块管理:后台数据库需要存放各个版块信息,如版主、版块名称、贴子数等

    第二步:标识对象

    • 实体一般是名词
      • 用户对象
      • 板块对象
      • 帖子对象
      • 跟帖对象

    第三步:标识每个实体的属性

    • 用户对象

      • 昵称
      • 密码
      • 电子邮件
      • 生日
      • 性别
      • 用户的等级
      • 备注信息
      • 注册日期
      • 状态
      • 积分
    • 板块对象

      • 板块名称
      • 版主
      • 本版格言
      • 点击率
      • 发帖数
    • 帖子对象

      • 发帖人
      • 发帖表情
      • 回复数量
      • 标题
      • 正文
      • 发帖时间
      • 点击数
      • 状态
      • 最后回复时间
    • 跟贴对象

      • 帖子编号
      • 回帖人
      • 回帖表情
      • 标题
      • 正文
      • 回帖时间
      • 点击数

    第四步:标识对象之间的关系

    • 绘制E-R图

      • E-R(Entity-Relationship)实体关系图
    • 符号及含义

      • □ 空方块 实体,一般是名词
      • ○ 空圆 属性,一般是名词
      • ◇ 空菱形 关系,一般是动词
    graph TD; 用户对象 --> 管理 --> 板块 用户对象 --> 昵称 用户对象 --> ...
    • 将E-R图转成表
      • 实体转成表,属性转成字段
      • 如果没有合适的字段做主键,给表添加一个自动增长列做主键

    第五步:将模型转化为数据库

    • 用EA软件

    第六步:数据规范化

    • 数据库设计三范式

      • 第一范式:确保每列原子性
        • 确保每列的原子性,一个字段表示一个含义
      • 第二范式:非关键字段必须依赖于关键字段
        • 在满足第一范式的前提下,要求每个表只描述一件事情
      • 第三范式:消除传递依赖
        • 在满足第二范式的前提下,除了主键以外的其他列消除传递依赖
    • 反3NF

      • 范式越高,数据冗余越少,但是效率有时就越地下,为了提高运行效率,可以适当让数据冗余。
    • 例题说明

      • 下面的设计不满足第三范式,但是高考分数表就是这样设计的
      • 高考分数峰值访问量非常大,这时候就是性能更重要
      • 当性能和规范化冲突的时候,我们首选性能
      • 这就是“反三范式”
    学号 姓名 语文 数学 总分
    1 李白 77 88 165
    • 小结
      • 第一范式约束的所有字段
      • 第二范式约束的主键和非主键的关系
      • 第三范式约束的非主键之间的关系
      • 范式越高,冗余越少,但表数业越多
      • 规范化和性能的关系 :性能比规范化更重要

    数据库设计例题

    • 需求

      • 假设某建筑公司要设计一个数据库
      • 公司的业务规则概括说明如下
        • 公司承担多个工程项目,每一项工程有:工程号、工程名称、施工人员等
        • 公司有多名职工,每一名职工有:职工号、姓名、性别、职务(工程师、技术员)等
        • 公司按照工时和小时工资率支付工资,小时工资率由职工的职务决定(例如,技术员的小时工资率与工程师不同)
    • 标识实体

      • 工程表
      • 职工表
      • 职务表
      • 工时表
    • 数据库设计

      • 工程表 --> 工程号 -> 工程名称
      • 员工表 --> 职工表 -> 姓名 + 职务
      • 职务表 --> 职务 -> 小时工资率
      • 工时表 --> 工程号 + 职工号 -> 工时

    更改定界符 delimiter

    • 一般情况下的定界符

      • 其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了
      • 默认情况下,delimiter是分号;
      • 在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令
    • 可能输入较多的语句,且语句中包含有分号时的定界符设置

      • 默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句
      • 因为mysql一遇到分号,它就要自动执行
      • 这种情况下,就需要事先把delimiter换成其它符号,如//或$$
    MariaDB [sel]> create table bank(
        -> card char(4) primary key comment '卡号',
        -> money decimal(10,2) not null
        -> )charset=utf8;
    # `Query OK, 0 rows affected (0.023 sec)`
    
    MariaDB [sel]> insert into bank values ('1001',1000),('1002',10);
    # `Query OK, 2 rows affected (0.012 sec)`
    # `Records: 2  Duplicates: 0  Warnings: 0`
    
    MariaDB [sel]> begin;
    # `Query OK, 0 rows affected (0.000 sec)`
    
    MariaDB [sel]> delimiter //
    MariaDB [sel]> update bank set money=money-100 where card='1001';
        -> update bank set money=money+90 where card='1002'//
    # `Query OK, 1 row affected (0.008 sec)`
    # `Rows matched: 1  Changed: 1  Warnings: 0`
    
    Query OK, 1 row affected (0.008 sec)
    # `Rows matched: 1  Changed: 1  Warnings: 0`
    
    MariaDB [sel]> rollback //
    # `Query OK, 0 rows affected (0.008 sec)`
    
    MariaDB [sel]> select * from bank //
    +------+---------+
    | card | money   |
    +------+---------+
    | 1001 | 1000.00 |
    | 1002 |   10.00 |
    +------+---------+
    # `2 rows in set (0.000 sec)`
    
  • 相关阅读:
    linux学习17 运维核心技能-Linux系统下用户权限管理
    linux学习16 Linux用户和组管理命令演练和实战应用
    linux学习15 Linux系统用户和组全面讲解
    linux学习14 Linux运维高级系统应用-glob通配及IO重定向
    linux学习13 Linux运维常用文件管理命令及系统变量基础
    linux学习12 bash的常见特性及文本查看命令实战
    linux学习11 Linux基础命令及命令历史
    linux学习10 Linux目录结构和根文件系统全面讲解
    【Hadoop离线基础总结】Hive调优手段
    【Hadoop离线基础总结】Hive的基本操作
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/14137656.html
Copyright © 2020-2023  润新知