📜  分布式 DBMS 中的碎片化

📅  最后修改于: 2021-09-09 11:19:29             🧑  作者: Mango

什么是碎片化?

分片是将整个或整个数据库划分为各种子表或子关系的过程,以便将数据存储在不同的系统中。子关系或子表的小块称为片段。这些片段称为逻辑数据单元,存储在各个站点。必须确保这些片段可以用来重建原始关系(即,没有任何数据丢失)。

在分片过程中,比方说,如果一个表 T 被分片并被分成多个分片,比如 T1、T2、T3….TN。这些片段包含足够的信息以允许恢复原始表 T。这种恢复可以通过对各种片段使用 UNION 或 JOIN 操作来完成。这个过程称为数据碎片化。所有这些片段都是独立的,这意味着这些片段不能来自其他片段。用户不需要在逻辑上关心碎片,这意味着他们不应该担心数据是碎片的,这称为碎片独立性,或者我们可以说碎片透明度

好处 :

  • 由于数据存储在使用地点附近,数据库系统的效率将提高
  • 本地查询优化方法对于某些查询就足够了,因为数据在本地可用
  • 为了维护数据库系统的安全和隐私,分片是有利的

缺点:

  • 如果需要来自不同片段的数据,访问速度可能会非常高
  • 如果我们使用递归分片,那么它会非常昂贵

我们有 3 种对表进行数据分片的方法:

  • 横向碎片化
  • 垂直碎片化
  • 混合或混合碎片

让我们一一讨论它们。

1. 水平碎片——水平碎片是指通过将每一行或(一组行)关系分配给一个或多个碎片来水平划分表的过程。然后将这些片段分配到分布式系统中的不同侧。表的一些行或元组放在一个系统中,其余的放在其他系统中。属于水平片段的行由关系的一个或多个属性的条件指定。在表 T 上的关系代数水平分片中,可以表示如下:

请注意,可以对片段执行联合操作以构造表 T。这样的片段包含表 T 的所有行,称为完整的水平片段。

例如,考虑一个 EMPLOYEE 表 (T) :

Eno  Ename Desig Salary Dep
101 A abc 3000 1
102 B abc 4000 2
103 C abc 5500 3
104 D abc 5000 1
105 E abc 2000 4

此 EMPLOYEE 表可以分为不同的片段,例如:

EMP 1 = σ Dep = 1 名员工

EMP 2 = σ Dep = 2雇员

这两个片段是:Dep = 1的T1片段

Eno Ename Desig Salary Dep
101 A abc 3000 1
102 B abc 4000 2

同样,基于 Dep = 2 的 T2 片段将是:

Eno Ename Desig Salary Dep
103 C abc 5500 3
104 D abc 5000 1
105 E abc 2000 4

现在,这里可以得到 T,因为T = T1 ∪ T2 ∪ …。 ∪ TN

2. 垂直碎片化——垂直碎片化是指通过属性列垂直分解表的过程。在这种碎片化中,一些属性存储在一个系统中,其余的存储在其他系统中。这是因为每个站点可能不需要表的所有列。为了进行恢复,每个片段必须包含表中的主键字段。碎片应该以这样一种方式,我们可以通过采用自然的 JOIN 操作从碎片重建表,并使其成为可能,我们需要在模式中包含一个称为Tuple-id的特殊属性。为此,用户可以使用任何超级密钥。这样,元组或行可以链接在一起。投影如下:

例如,对于 EMPLOYEE 表,我们将 T1 设为:

Eno Ename Desig Tuple_id
101 A abc 1
102 B abc 2
103 C abc 3
104 D abc 1
105 E abc 4

对于第二个。垂直分片后的关系子表如下:

Salary Dep Tuple_id
3000 1 1
4000 2 2
5500 3 3
5000 1 4
2000 4 5

这是 T2,为了回到原来的 T,我们将这两个片段 T1 和 T2 连接为π EMPLOYEE (T1 ⋈ T2)

3. 混合分片——表格的垂直分片和一些分片的进一步水平分片的组合称为混合或混合分片。为了定义这种类型的碎片,我们使用关系代数的 SELECT 和 PROJECT 操作。在某些情况下,水平和垂直碎片不足以为某些应用程序分发数据,在这种情况下,我们需要一种称为混合碎片的碎片。

混合分片可以通过两种不同的方式完成:

  1. 第一种方法是首先创建一组或一组水平片段,然后从一个或多个水平片段创建垂直片段。
  2. 第二种方法是首先创建一组或一组垂直片段,然后从一个或多个垂直片段创建水平片段。
    可以通过 JOIN 和 UNION 操作的组合获得原始关系,如下所示:

例如,对于我们的EMPLOYEE表,下面是混合分片的实现是π Ename, DesigEno > 102 (EMPLOYEE))

这种碎片化的结果是:

Ename Desig
A abc
B abc
C abc