我读到了
SELECT
是将关系水平划分为两组元组。
和
PROJECT
是将关系垂直划分为两个关系。
但是,我不明白那是什么意思。能通俗点的解释一下吗?
不是对问题的完整答案,但它回答了问题标题中的问题。所以横向和纵向数据库分区的一般含义是:
水平分区涉及将不同的行放入不同的表中。可能邮政编码小于 50000 的客户存储在 CustomersEast,而邮政编码大于或等于 50000 的客户存储在 CustomersWest。这两个分区表是CustomersEast 和CustomersWest,而可以在这两个分区表上创建一个具有联合的视图,以提供所有客户的完整视图。
垂直分区涉及创建具有较少列的表并使用额外的表来存储剩余的列。规范化还涉及跨表的列拆分,但垂直分区超出了这一范围,即使已经规范化了也会对列进行分区。
在此处查看更多详细信息。
投影在关系中创建属性子集,因此是“垂直分区”
选择在关系中创建元组的子集,因此是“水平分区”
(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
诸如此类的表达式
PROJECT a, b (SELECT a=1 (r))
-- SELECT a, b FROM r WHERE a=1
会做”
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)
导致
a : b
------
1 : 2
1 : 2
死灵术。
我认为现有的答案太抽象了。
所以在这里我尝试一个更实际的解释:
从开发人员的角度来看,分区完全与性能有关。
更准确地说,它是关于当您的表中有大量数据时会发生什么,并且您仍然希望快速查询数据。
以下是Bill Karwin关于水平分区到底是什么的幻灯片的摘录:
以上是不好的,因为:
水平分区将一个表分成多个表。然后,每个表都包含相同数量的列,但行数更少。
区别:查询性能和简单性
该问题的解决方案是垂直分区
适当的标准化是垂直分区的一种形式
引用technet
垂直分区将一个表分成包含较少列的多个表。
垂直分区的两种类型是归一化和行拆分:
规范化是从表中删除冗余列并将它们放入通过主键和外键关系链接到主表的辅助表中的标准数据库过程。
行拆分将原始表垂直划分为列数较少的表。拆分表中的每个逻辑行与其他表中的相同逻辑行匹配,由所有分区表中相同的 UNIQUE KEY 列标识。例如,连接每个拆分表中 ID 为 712 的行会重新创建原始行。与水平分区一样,垂直分区允许查询扫描更少的数据。这提高了查询性能。例如,一个包含 7 列且通常仅引用前 4 列的表可能受益于将后三列拆分为单独的表。应该仔细考虑垂直分区,因为分析来自多个分区的数据需要连接表的查询。
如果分区非常大,垂直分区也会影响性能。
这很好地总结了它。
这篇SO帖子描述了这样的区别:
选择操作:此操作用于从指定给定逻辑的表(关系)中选择行,称为
predicate
. 谓词是用户定义的条件,用于选择用户选择的行。项目操作:如果用户有兴趣选择几个属性的值,而不是选择表(关系)的所有属性,那么应该去
PROJECT
操作。
SELECT 是实际的 SQL 操作(语句),而 PROJECT 是关系代数中使用的术语。
从您在 SO 而不是 MathOverflow 上发布此内容来看,如果您只想学习 SQL 来开发应用程序,我建议您不要阅读关系代数书籍。
如果您急需推荐一本关于(高级)SQL 的好书,这里有一本
SQL 反模式:避免数据库编程的陷阱
Bill Karwin
ISBN-13:978-1934356555
ISBN-10:1934356557
这是一本值得一读的关于 SQL 的书。
我在那里看到的大多数其他关于 SQL 的书籍都可以用这个关于 Photoshop 书籍的愤世嫉俗的说法来概括:
关于 Photoshop 的书籍比实际使用 Photoshop 的人多。
水平与垂直的区别来自数据库的传统表格视图。数据库可以垂直拆分——将不同的表和列存储在单独的数据库中, 也可以水平拆分——将同一个表的行存储在多个数据库节点中。
水平分区通常称为数据库分片。
# Example of vertical partitioning
fetch_user_data(user_id) -> db[“USER”].fetch(user_id)
fetch_photo(photo_id) -> db[“PHOTO”].fetch(photo_id)
# Example of horizontal partitioning
fetch_user_data(user_id) -> user_db[user_id % 2].fetch(user_id)
在此处查找更多详细信息:https ://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6
考虑数据库中的单个表,它有一些行和列。
您可以通过两种方式选择数据:您可以选择一些行,或者您可以选择一些列(好吧,三种方式,您可以选择一些行,然后在其中选择一些列。)
您可以将 select 视为选择一些行 - 这是水平的(而不是选择其余的,因此是分区的)
您可以将项目视为选择一些列 - 这是垂直的(而不是选择其余的)