数据库学习笔记

ER图

矩形框:

  • 表示实体,在矩形框中写上实体的名字

椭圆形框:

  • 表示实体或联系的属性

菱形框:

  • 表示联系,在框中记入联系名

连线:

  • 实体与属性之间;实体与联系之间;联系与属性之间用直线相连,(对于一对一联系,要在两个实体连线方向各写1; 对于一对多联系,要在一的一方写1,多的一方写N;对于多对多关系,则要在两个实体连线方向各写N,M。)。

1653465192358

范式

三级范式

1FN

一张表的每一个属性都是原子性的, 就是说不能一个属性不能表示一个集合, 他的语义要是确定的

1653466021636

2FN

在1FN的基础上, 非主属性直接完全依赖或间接完全依赖候选键。(不可部分依赖候选键), 二级范式要求一张表就表述一件事情

例:学生选课表的设计应该如何实现?
假设选课关系表为学号、姓名、年龄、课程名称、乘积、学分。
那么这个表里面的主键应该为学号和课程名称联合作为主键,这是毫无疑问的,但是不符合第二范式:因为姓名
可以由学号完全决定,和课程名称没有任何关系,也就是说姓名这个非主键字段对这个联合主键有部分依赖关系存在。
同理,学分完全由课程名称来决定,也是部分依赖的。
成绩是不存在部分依赖的,是由学号和课程名称共同决定的

解决不满足第二范式情况的办法是分解主键
建立学生表(学号,姓名,年龄)课程表(课程名称、学分)和选课关系(学号,课程名称,成绩)

3FN

非主属性直接完全依赖候选键(表中的每一列只与主键直接相关而不是间接相关)

1653465969251

怎么在数据库中的表中表示关系

一对一

  • 通过外键或者建立一张关系表

一对多

  • 的那一端来存放外键(比如部门和领导关系, 假设一个部门只能又一个领导, 一个员工可以是多个不能的领导, 那么就应该在部门中添加一个领导的外键)
  • 还可以用关系表方式。

多对多

  • 只有关系表方式

分库分表主从备份

分库

  • 按照业务模块分库, 没什么好说的

分表

  • 将一直大的表分成几张小表
垂直分表
  • 将一些字段分离出来带上主键成立新的表, 比如说txt大字段
水平分表
考虑使用水平分表的情况
  • 未来表容易达到500W行
  • 未来表大小容易2G以上
如何分区(表)
  • 在创建表的时候用

    •   CREATE TABLE customer703
          ( cust_name      varchar2(20)
          , cust_id       NUMBER
          , time_id       varchar2(20)
          )
         PARTITION BY RANGE (time_id)
         ( PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('2010-04-01','yyyy-mm-dd'))
        , partition sales_q_other VALUES LESS THAN(maxvalue)
         );
      
    • image-20220613224846150

项目中如何使用
Mycat
  • 是中间件软件服务, 需要单独的部署

  • 配置文件

    • service.xml

      • 配置Mycat服务的基本信息, 包括用户名, 密码

      •   <user name="test">
                  <property name="password">test</property>  
                  <property name="schemas">lunch</property>  
                  <property name="readOnly">false</property>  
                  
                  <!-- 表级 DML 权限设置 -->
                  <!--        
                  <privileges check="false">
                      <schema name="TESTDB" dml="0110" >
                          <table name="tb01" dml="0000"></table>
                          <table name="tb02" dml="1111"></table>
                      </schema>
                  </privileges>       
                   -->
              </user>
        
    • schema.xml

      •   <?xml version="1.0"?>
          <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
          <mycat:schema xmlns:mycat="http://io.mycat/">
          
          <!-- 数据库配置,与server.xml中的数据库对应 -->
              <schema name="lunch" checkSQLschema="false" sqlMaxLimit="100">
                  <table name="lunchmenu" dataNode="dn1"  />
                  <table name="restaurant" dataNode="dn1"  />
                  <table name="userlunch" dataNode="dn1"  />
                  <table name="users" dataNode="dn1"  />
                  <table name="dictionary" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2"  rule="mod-long" />
          
                  
              </schema>
          
          <!-- 分片配置 -->
              <dataNode name="dn1" dataHost="test1" database="lunch" />
              <dataNode name="dn2" dataHost="test2" database="lunch" />
          
          <!-- 物理数据库配置 -->
              <dataHost name="test1" maxCon="1000" minCon="10" balance="0"  writeType="0" dbType="mysql" dbDriver="native">
                  <heartbeat>select user();</heartbeat>
                  <writeHost host="hostM1" url="192.168.0.2:3306" user="root" password="123456">  
                  </writeHost>
              </dataHost>
          
              <dataHost name="test2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
                  <heartbeat>select user();</heartbeat>
                  <writeHost host="hostS1" url="192.168.0.3:3306" user="root" password="123456">  
                  </writeHost>
              </dataHost>
          
          </mycat:schema>
        
    • rule.xml

      •   <tableRule name="mod-long">
                  <rule>
                      <columns>id</columns>
                      <algorithm>mod-long</algorithm>
                  </rule>
              </tableRule>
              
          <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
                  <!-- how many data nodes -->
                  <property name="count">2</property>
              </function>
        
Sharding-JDBC
  • 两者的区别
    • mycat是中间件软件服务, 需要单独的部署; shardingJdbc是jar包
    • mycat不需要改造sql, shardingJdbc需要改造sql
常见的分区规则
其他
  • 分表与分区的区别

    • 广义上来说, 我们说的分表就是分区

    • 狭义上来说

      • 分表

        • 把一张表粉尘N个表, 对外有感知
      • 分区

        • 把一张表的数据分成N个区块, 在逻辑上看最终只是一张表, 对外无感知, 但在底层是N个雨里区块组成
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BinBin_Bang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值