数据库关系数据库(Relational Databases)

Posted 宣之于口

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库关系数据库(Relational Databases)相关的知识,希望对你有一定的参考价值。

关系数据库(Relational Databases)

关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据库中的数据

Relational Query Languages

  • Tuple Relational Calculus (TRC)
  • Relational Algebra (RA)
  • SQL

举例说明:

零、名词概念

1. 基数 和 参数数

  • cardinality:关系中tuple的数量, 即数据量行数

  • arity: 参数数目,列数

实例:arity(Students) = 5, cardinality(Students) = |Students| = 3

一. TRC

与关系代数不同,元组关系演算是一种非过程查询语言。元组演算仅提供查询的描述,但不提供解决查询的方法。因此,它说明了该做什么而不是该怎么做。

在元组演算中,查询表示为: t|P(t). 它表示所有元组t的集合,使得谓词P对t为真

  • 我们写 t ∈ R t \\in R tR表示t是关系R中的一个元组

举例说明

Customer (CUSTOMER NAME, STREET, CITY)
Branch (BRANCH NAME, BRANCH CITY)
Account (ACCOUNT NUMBER, BRANCH NAME, BALANCE) 
Loan (LOAN NUMBER, BRANCH NAME, AMOUNT) 
Borrower (CUSTOMER NAME, LOAN NUMBER)
Depositor (CUSTOMER NAME, ACCOUNT NUMBER)

Find the loan number, branch, amount of loans of greater than or equal to 10000 amount

t ∣ t ∈ L o a n ∩ t [ a m o u n t ] > = 10000 \\lbrace t|t \\in Loan \\cap t[amount] >= 10000 \\rbrace ttLoant[amount]>=10000

Find the loan number for each loan of an amount greater or equal to 10000

t ∣ ∃ s ∈ L o a n ( t [ l o a n − n u m b e r ] = s [ l o a n − n u m b e r ] ∩ s [ a m o u n t ] > = 10000 ) \\lbrace t| \\exists s \\in Loan (t[loan-number] = s[loan-number] \\cap s[amount] >= 10000) \\rbrace tsLoan(t[loannumber]=s[loannumber]s[amount]>=10000)

Find the names of all customers who have a loan and an account at the bank.

t ∣ ∃ s ∈ B o r r o w e r ( t [ c u s t o m e r − n a m e ] = s [ c u s t o m e r − n a m e ] ) ∩ ∃ u ∈ D e p o s i t o r ( t [ c u s t o m e r − n a m e ] = u [ c u s t o m e r − n a m e ] ) \\lbrace t| \\exists s \\in Borrower (t[customer-name] = s[customer-name]) \\cap \\exists u \\in Depositor (t[customer-name] = u[customer-name]) \\rbrace tsBorrower(t[customername]=s[customername])uDepositor(t[customername]=u[customername])

Find the names of all customers having a loan at the “ABC” branch

t ∣ ∃ s ∈ B o r r o w e r ( t [ c u s t o m e r − n a m e ] = s [ c u s t o m e r − n a m e ] ) ∩ ∃ u ∈ L o a n ( s [ l o a n − n u m b e r ] = u [ l o a n − n u m b e r ] ∩ s [ b r a n c h − n a m e ] = ′ ′ A B C ′ ′ ) \\lbrace t| \\exists s \\in Borrower (t[customer-name] = s[customer-name]) \\cap \\exists u \\in Loan (s[loan-number] = u[loan-number] \\cap s[branch-name] =''ABC'') \\rbrace tsBorrower(t[customername]=s[customername])uLoan(s[loannumber]=u[loannumber]s[branchname]=ABC)

二. 关系代数(RA)

运算对象、运算符、运算结果是运算的三大要素。关系代数的运算对象是关系,运算结果亦为关系。关系代数的运算符包括两类:集合运算符和专门的关系运算符

1. 关系运算

a. 基础

假设存在集合R, S

集合运算前提: R和S必须具有相同属性集合的模式, 关系S和R的列必须是有序的,两个关系的属性的顺序应该是一致的

类型符号含义举例
集合运算 R ∪ S R \\cup S RSR和S的并(union),是R有的或S有的或者两者都有的,如果一个元素在R和S中都有的话,那么只出现一次。
R ∩ S R \\cap S RSR和S的交,是R和S所共有的元素
选择运算 σ \\sigma σ选择操作用于选出满足条件的某些行,并且将整个操作记为 σ C ( R ) \\sigma_C(R) σC(R)。C被称作条件表达式$\\sigma_length>=100 ,AND , name=‘ABC’(Movies) $
投影 π \\pi π投影操作用于从关系R中找出拥有某些属性的列
笛卡尔乘积 R × S R \\times S R×S笛卡尔乘积就是将两个关系进行组合,组合的结果中第一部分可以是R中的任意一行,第二部分可以是S中的任意一行R 中有属性 A,B; S 中有属性 B,C,D; 则$ R \\times S$属性为: A, R.B, S.B,C,D
difference R     S R \\, \\text\\ S R S返回存在于第一个集合中,但不存在于第二个集合中
连接运算 ⋈ \\bowtie 自然连接是一种特殊的等值连接。它要求两个关系中进行比较的分量必须是同名的属性组,并在结果中把重复的属性列去掉. 对于某行来说,如果两个列名相同,且元素相同,则进行连接。 R ⋈ C S = σ C ( R × S ) R \\bowtie_C S = \\sigma_C(R \\times S) RCS=σC(R×S)
θ \\theta θ等值连接(equijoin)是从关系R与S的广义笛卡儿积中选取A\\B属性值相等的那些元组

b. 扩展

聚合函数: count, sum, max, min, avg

命名和重命名: 符号: ρ \\rho ρ

2. 实例

  • π A , C ( R ⋈ σ B = 1 S ) \\pi_A,C(R \\bowtie\\sigma_B=1S) πA,C(RσB=1S)

  • π ( σ B = 1 R ) × π C ( σ B = 1 S ) \\pi(\\sigma_B=1R) \\times \\pi_C(\\sigma_B=1S) π(σB=1R)×πC(σB=1S)

  • π A , C ( π A R × σ B = 1 S ) \\pi_A,C(\\pi_AR \\times \\sigma_B=1S) πA,C(πAR×σB=1S)

3. RA 软件

参考文档: 官方文档

安装操作

# 安装
pip3 install radb
# ra 转为db
radb -i beers.ra beers.db
# 运行
radb beers.db
# 导入 ra.jar 和 mondial.properties 文件
java -jar ra.jar mondial.properties
# 导出log
radb mondial.db -i xxx.ra -o xxx.log

基本使用

1. 选择

使用: \\select_condition input_relation

比较运算符:<=, <, =, >, >=, and <>

逻辑连接词: and, or, not

\\select_name='Amy' or name='Ben' Drinker;
\\select_name like 'A%' Drinker;

2.投影

使用: \\project_attr_list input_relation

字符串连接: ||

# 选出Serves表中满足select条件的bar和beer列
\\project_bar, beer \\select_bar='Talk of the Town' Serves;
# 返回的beer = 'Special Edition ' + beer值
\\project_bar, 'Special Edition '||beer, price+1 Serves;

3. Theta-连接

使用: input_relation_1 \\join_cond input_relation_2

# 连接Drinker(name, address) 和 Frequents(drinker, bar, times_a_week) 
Drinker \\join_name=drinker Frequents;
# 避免混淆, 加上条件
Drinker \\join_Drinker.name=Frequents.drinker Frequents;

4. 自然连接

使用: input_relation_1 \\join input_relation_2

Drinker \\join \\rename_name, bar, times_a_week Frequents;.

5. 笛卡尔积

使用:input_relation_1 \\cross input_relation_2

Drinker \\cross Frequents;

# 以下两种写法等价
\\select_Drinker.name=Frequents.drinker (Drinker \\cross Frequents);
Drinker \\join_Drinker.name=Frequents.drinker Frequents;

6.集合运算

input_relation_1 \\union input_relation_2
input_relation_1 \\diff input_relation_2
input_relation_1 \\intersect input_relation_2

7.聚合函数

使用: \\aggr_aggr_attr_list input_relation

Group: \\aggr_group_by_attrs: aggr_attr_list input_relation

\\aggr_sum(price), avg(price) Serves;
\\aggr_beer: avg(price), count(1) Serves;

以上是关于数据库关系数据库(Relational Databases)的主要内容,如果未能解决你的问题,请参考以下文章

数据库关系数据库(Relational Databases)

ORM(Object-Relational Mapping 对象关系映射)如何实现(转)

ORM(Object Relational Mapping:对象关系映射)

一:ORM关系对象映射(Object Relational Mapping,简称ORM)

django关系对象映射(Object Relational Mapping,简称ORM)

Object Relational Mapping(ORM)