0%

数据库笔记

以下Mysql为例

数据库完整性

实体完整性

实体完整性即主码,用PRIMARY KEY定义.

  • 列级约束:只能应用于一列上。
  • 表级约束:可以应用于表的多个列上。

简而言之,如果完整性约束涉及到该表的多个属性列,必须定义在表级上,否则既可以定义在列级也可以定义在表级。

参照完整性

参照完整性即外码,用FOREIGN KEY (列名) REFERENCES <表名>(列名)定义.

用constraint指定约束名,约束不指定名称时,系统会给定一个名称。

注意:外码一定参照主码(可以是其他表的主码,也可以时自己的),而且外码的列数一定要等于被参照表的主码列数。

违约处理:对被参照表进行update/delete/insert操作时会破坏参照完整性时,参照表需要告诉被参照表听改怎么做。需要对参照表定义外码时添加on delete/on update[<no action>/<cascade>]

  • CASCADE:在父表(被参照表)上update/delete记录时,同步子表(参照表)的匹配记录。
  • SET NULL:在父表(被参照表)上update/delete记录时,将子表(参照表)上匹配的列设为null(子表的外键列不能为not null)。
  • NO ACTION:如果子表中有匹配的记录,不允许对父表进行操作。
  • RESTRICT:同NO ACTION,立即检查外键约束。

NULL、RESTRICT、NO ACTION
删除:从表记录不存在时,主表才可以删除。删除从表,主表不变
更新:从表记录不存在时,主表才可以更新。更新从表,主表不变(无法更新从表)

CASCADE
删除:删除主表时自动删除从表。删除从表,主表不变
更新:更新主表时自动更新从表。更新从表,主表不变(无法更新从表)

SET NULL
删除:删除主表时自动更新从表值为NULL。删除从表,主表不变
更新:更新主表时自动更新从表值为NULL。更新从表,主表不变

总结:CASCADE对主表操作 主表影响子表.
RESTRICT对主表操作 子表限制主表.
Mysql中均无法更新子表.

用户定义完整性

列值非空(not null),列值唯一(unique),列值需要满足条件表达式(check).

  • not null:列值不能为空,(列级完整性约束)
  • unique:列值唯一,(列级或表级约束)
  • check:列值应该满足的条件,(列级或表级约束)
a b
属性 列级
元组 表级

完整性约束命名子句

完整性约束命名子句是用来给完整性约束命名,这样我们就可以通过该名称对完整性约束进行删除、增加操作。

数据定义

索引类型

类型 特点
普通索引 是最基本的索引,它没有任何限制。
唯一索引 索引列的值必须唯一,但允许有空值。
主键索引 是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。
组合索引 指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。
全文索引 主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引配合match against操作使用,而不是一般的where语句加like。

索引方法

类型 特点
BTREE BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量
HASH Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。

数据查询

连接查询

  1. 等值与非等值连接查询

=为等值连接,连接字段必须为可比的。

  1. 自身连接

自己对自己相连,比如要查询先修课的先修课,要对自己查询两次。

  1. 外连接

LEFT JOIN 保存左侧所有元组,右侧不存在的用NULL补齐.(Mysql中LEFT JOINLEFT OUTER JOIN相同)

  1. 多表连接

跨多个表进行连接查询。

  1. *交叉连接

笛卡尔积。
SELECT * FROM <TABLE1>, <TABLE2>SELECT * FROM <TABLE1> CROSS JOIN <TABLE2>

  1. *内连接

如果没有连接条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以互换。

SELECT <字段名> FROM <表1> INNER JOIN <表2> [ON子句]

嵌套查询

  1. 不相关子查询

子查询的查询条件不依赖于父查询。
有些嵌套查询可以使用连接运算替代,有些不可以。

  1. 相关子查询

子查询的条件依赖于父查询。
SELECT Sno, Cno FROM SC x WHERE Grade >= (SELECT AVG(Grade) FROM SC y WHERE y.Sno = x.Sno)

  1. 带有ANY(SOME)或ALL谓词的子查询

子查询返回单值用比较运算符,返回多值时需要用ANY(SOME)或ALL谓词修饰符。且使用ANY或ALL时需要同时使用比较运算符。

  1. 带有EXISTS谓词的子查询

子查询不返回任何数据,只产生逻辑真值truefalse

注意:全称量词可以通过否运算转换成存在量词。
注意:蕴含式可以转换为析取式。

  1. 集合查询

并操作UNION,交操作INTERSECT,差操作EXCEPT.

  1. 派生表查询

子查询出现在FROM子句中时,这是子查询生成临时的派生表。

注意:必须为派生关系指定一个别名。

BERT 概述

BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,因为decoder是不能获要预测的信息的。模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。

训练方法:

  • 它在训练双向语言模型时以减小的概率把少量的词替成了Mask或另一个随机的单词。
  • 增加了一个预测下一句的loss。

特点:

  • 模型深,12层,中间层只有1024wide。Transformer的中间层有2048。(深而窄 比 浅而宽 的模型更好?)
  • MLM(Masked Language Model),同时利用左侧和右侧的词语。

Reference

BERT | Bidirectional Encoder Representation from Transformers
https://easyai.tech/ai-definition/bert/

Transfomer 概述

和经典的 seq2seq 模型一样,Transformer 模型中也采用了 encoer-decoder 架构。上图的左半边用 NX 框出来的,就代表一层 encoder,其中论文里面的 encoder 一共有6层这样的结构。上图的右半边用 NX 框出来的,则代表一层 decoder,同样也有6层。

定义输入序列首先经过 word embedding,再和 positional encoding 相加后,输入到 encoder 中。输出序列经过的处理和输入序列一样,然后输入到 decoder。

最后,decoder 的输出经过一个线性层,再接 Softmax。

于上便是 Transformer 的整体框架,下面先来介绍 encoder 和 decoder。

Encoder

由 6 层相同的层组成,每一层分别由两部分组成:

  • 第一部分是 multi-head self-attention

  • 第二部分是 position-wise feed-forward network,是一个全连接层

两个部分,都有一个残差连接(residual connection),然后接着一个 Layer Normalization。

Decoder

和 encoder 类似,decoder 也是由6个相同的层组成,每一层由三个部分组成:

  • 第一个部分是 multi-head self-attention mechanism
  • 第二部分是 multi-head context-attention mechanism
  • 第三部分是一个 position-wise feed-forward network和encoder 一样,上面三个部分的每一个部分,都有一个残差连接,后接一个 Layer Normalization。

decoder 和 encoder 不同的地方在 multi-head context-attention mechanism

Attention

Attention用一句话来描述,就是encoder层的输出经过加权平均后再输入到decoder层中。它主要应用在seq2seq模型中,这个加权可以用矩阵来表示,也叫Attention矩阵。它表示对于某个时刻的输出y,他在输入x上各个部分的注意力。这个注意力就是加权。

Self-Attention

attention有两个隐状态,hi和st。前者是输入序列第i个位置产生的隐状态,后者是输出序列在第t个位置产生的隐状态。self-attention就是,输出序列就是输入序列。自己计算自己的attention得分。

Context-Attention

context-attention是encoder和decoder之间的attention,是两个不同序列之间的attention,与来源于自身的self-attention相区别。

计算attention权重的方法:

  • additive attention
  • local-base
  • general
  • dot-product
  • scaled dot-product

Scaled Dot-Product Attention

通过query和key的相似性程度来确定value的权重分布。

img-scaled-dot-attention


Reference

Transformer
https://easyai.tech/ai-definition/transformer/

Attention
https://easyai.tech/ai-definition/attention/

EncoderDecoder Seq2Seq

https://easyai.tech/ai-definition/encoder-decoder-seq2seq/

NLP中处理文本方法

由于文本是一种非架构化的数据,我们要将这种非结构化的数据转化为结构化的信息,这样我们才能对其进行处理。

现在文本表示大致有三种方式。

img

One-Hot

向量中每一个位置代表一个词

one-hot的缺点:

  • 无法表达词语之间的关系
  • 这种过于稀疏的向量,导致计算和存储的效率不高

整数编码

整数编码的缺点

  • 无法表达词语之间的关系
  • 对于模型解释而言,整数编码可能具有挑战性

Word Embedding (词嵌入)

优点:

  • 可以将文本通过一个低维向量来表达,不像one-hot长
  • 语义相似的词在向量空间上比较相近
  • 通用性强,可用在不同的任务中

Word2Vec

基于统计方法来获得词向量的方法。

两种训练模式:

  • 通过上下文来预测当前词(CBOW)
  • 通过当前词来预测上下文(Skip-gram)

提高速度的优化方法:

  • Negtive Sample (负采样)
  • Hierarchical Softmax

优点:

  • 由于Word2Vec会考虑上下文,跟之前的Embedding方法相比,效果要更好
  • 比之前的Embedding方法维度更少,速度更快
  • 通用性强,用于各种NLP任务

缺点:

  • 由于词和向量是一对一的关系,所以多义词的问题无法解决
  • Word2Vec是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化

GloVe

实现有三步:

  • 根据语料库构建一个共现矩阵,矩阵中的每一个元素代表单词和上下文单词在特定大小的上下文窗口内共同出现的次数。
  • 构建词向量和共现矩阵之间的近似关系。
  • loss function

Reference

词嵌入 | Word embedding

https://easyai.tech/ai-definition/word-embedding/

Word2vec

https://easyai.tech/ai-definition/word2vec/

GloVe详解

http://www.fanyeong.com/2018/02/19/glove-in-detail/