什么是数据库中的水平和垂直分区,有什么区别?

Joh*_*den 39 database

我看了

SELECT是关系到两组元组的水平分区.

和

PROJECT是将关系分为两个关系的垂直分区.

但是,我不明白这意味着什么.你能用外行的话解释一下吗?

Kul*_*ain 65

不是问题的完整答案,但它回答了问题标题中的问题.因此,水平和垂直数据库分区的一般含义是:

水平分区涉及将不同的行放入不同的表中.也许邮政编码小于50000的客户存储在CustomersEast中,而邮政编码大于或等于50000的客户存储在CustomersWest中.然后,两个分区表是CustomersEast和CustomersWest,而可以在两个分区表上创建具有联合的视图,以提供所有客户的完整视图.

垂直分区涉及创建具有较少列的表,并使用其他表来存储其余列.规范化还涉及在表之间拆分列,但垂直分区超出了这一范围,即使已经规范化,也会对列进行分区.

在这里查看更多细节.

  • 尽管他的问题似乎更多地与关系代数有关,但这个答案更多地是关于在数据的存储级别上进行分区。并不是说从概念上就没有太大的区别,只是为了明确说明这并不是对原始问题的直接答案(尽管这也是我仅通过阅读标题来解释它的方式)。 (2认同)

T I*_*T I 16

投影在关系中创建属性的子集,因此是"垂直分区"

选择在关系中创建元组的子集,因此是"水平分区"

给定一个表(r)作为

a : b : c : d : e
-----------------
1 : 2 : 3 : 4 : 5
1 : 2 : 3 : 4 : 5
2 : 2 : 3 : 4 : 5
2 : 2 : 3 : 4 : 5
Run Code Online (Sandbox Code Playgroud)

表达如

PROJECT a, b (SELECT a=1 (r))

-- SELECT a, b FROM r WHERE a=1
Run Code Online (Sandbox Code Playgroud)

会做"

a : b | c : d : e
-----------------
1 : 2 | 3 : 4 : 5
1 : 2 | 3 : 4 : 5
=================    <  -- horizontal partition (by SELECTION)
2 : 2 | 3 : 4 : 5
2 : 2 | 3 : 4 : 5

      ^  -- vertical partition (by PROJECTION)
Run Code Online (Sandbox Code Playgroud)

导致

a : b
------
1 : 2 
1 : 2 
Run Code Online (Sandbox Code Playgroud)


Ste*_*ger 10

Necromancing.
我认为现有的答案太抽象了.

所以我在这里尝试更实际的解释:

从开发人员的角度来看,分区完全取决于性能.
更准确地说,它是关于当表中有大量数据时会发生什么,并且您仍然希望快速查询数据.

这里有一些Bill Karwin关于完全横向分区的幻灯片的摘录:

可怕

以上是不好的,因为:

问题1

问题2

解决方案:

水平分割

水平分区将表分成多个表.然后,每个表包含相同数量的列,但行数较少.

解水平

区别:查询性能和简单性

柯克报价




现在,关于水平和垂直分区之间的区别:

"Tribbles"也可以在列中累积.例: 列Tribble

该问题的解决方案是垂直分区
正确的归一化是垂直分区的一种形式

引用technet

垂直分区将表分成多个包含较少列的表.

两种类型的垂直分区是规范化和行分割:

规范化是从表中删除冗余列并将它们放在通过主键和外键关系链接到主表的辅助表中的标准数据库过程.

行拆分将原始表垂直划分为具有较少列的表.拆分表中的每个逻辑行与其他表中的相同逻辑行匹配,由所有分区表中相同的UNIQUE KEY列标识.例如,从每个拆分表连接ID为712的行将重新创建原始行.与水平分区一样,垂直分区允许查询扫描较少的数据.这提高了查询性能.例如,包含七列的表(通常仅引用前四列)可能会将最后三列拆分为单独的表.应仔细考虑垂直分区,因为分析来自多个分区的数据需要连接表的查询.

如果分区非常大,垂直分区也会影响性能.

这总结得很好.

适当的归一化

现在在SELECT vs. PROJECT上:

这篇SO帖子描述了这样的差异:

选择操作:此操作用于从表(关系)中选择指定给定逻辑的行,该逻辑称为a predicate.谓词是用户定义的条件,用于选择用户选择的行.

项目操作:如果用户有兴趣选择几个属性的值,而不是选择表(关系)的所有属性,那么应该选择PROJECT操作.

SELECT是一个实际的SQL操作(语句),而PROJECT是关系代数中使用的术语.

从您在SO而不是MathOverflow上发布此内容来判断,如果您只是想学习用于开发应用程序的SQL,我建议您不要阅读关系代数书籍.

如果你是在迫切需要的建议的良好本书(高级)SQL,这里是一个

SQL Antipatterns:避免数据库编程的陷阱
Bill Karwin
ISBN-13:978-1934356555
ISBN-10:1934356557

这是一本关于SQL值得一读的书.
关于SQL的大多数其他书籍,我在那里看到的可以通过这个关于photoshop书的玩世不恭的陈述来总结:

关于photoshop的书比实际使用photoshop的人多.

  • 这应该是问题的正确答案。我们不希望去 StackOverflow 只是为了重新阅读维基百科中的所有内容。 (3认同)