DBMS关系分解
精华
小牛编辑
197浏览
2023-03-14
当关系模型中的关系不是适当的范式时,则需要分解关系。
在数据库中,它将表分成多个表。
如果关系没有适当的分解,则可能导致信息丢失等问题。
分解用于消除一些不良设计的问题,如异常,不一致和冗余。
分解的类型
1. 无损分解
- 如果信息没有从分解的关系中丢失,那么分解将是无损的。
- 无损分解保证了关系的连接将产生与分解时相同的关系。
- 如果所有分解的自然连接给出原始关系,则该关系被称为无损分解。
示例:
EMPLOYEE_DEPARTMENT 表的结构和数据如下:
EMP_ID | EMP_NAME | EMP_AGE | EMP_CITY | DEPT_ID | DEPT_NAME |
---|---|---|---|---|---|
22 | Denim | 28 | Mumbai | 827 | Sales |
33 | Alina | 25 | Delhi | 438 | Marketing |
46 | Stephan | 30 | Bangalore | 869 | Finance |
52 | Katherine | 36 | Mumbai | 575 | Production |
60 | Jack | 40 | Noida | 678 | Testing |
将上述关系分解为两个关系表:EMPLOYEE
和DEPARTMENT
,它们分别如下:
EMPLOYEE 表结构和数据如下 -
EMP_ID | EMP_NAME | EMP_AGE | EMP_CITY |
---|---|---|---|
22 | Denim | 28 | Mumbai |
33 | Alina | 25 | Delhi |
46 | Stephan | 30 | Bangalore |
52 | Katherine | 36 | Mumbai |
60 | Jack | 40 | Noida |
DEPARTMENT 表结构和数据如下 -
DEPT_ID | EMP_ID | DEPT_NAME |
---|---|---|
827 | 22 | Sales |
438 | 33 | Marketing |
869 | 46 | Finance |
575 | 52 | Production |
678 | 60 | Testing |
现在,当这两个关系在公共列“EMP_ID”上连接时,结果关系将如下所示:
Employee ⋈ Department 连接操作 -
EMP_ID | EMP_NAME | EMP_AGE | EMP_CITY | DEPT_ID | DEPT_NAME |
---|---|---|---|---|---|
22 | Denim | 28 | Mumbai | 827 | Sales |
33 | Alina | 25 | Delhi | 438 | Marketing |
46 | Stephan | 30 | Bangalore | 869 | Finance |
52 | Katherine | 36 | Mumbai | 575 | Production |
60 | Jack | 40 | Noida | 678 | Testing |
因此,分解是无损连接分解。
2. 依赖保留
- 它是数据库的一个重要约束。
- 在依赖项保留中,至少一个分解的表必须满足每个依赖项。
- 如果关系
R
被分解为关系R1
和R2
,则R
的依赖性必须是R1
或R2
的一部分,或者必须可以从R1
和R2
的函数依赖性的组合中导出。
例如,假设存在具有功能依赖性集(A -> BC
)的关系R(A,B,C,D)
。 关系R
被分解为R1(ABC)
和R2(AD)
,其是依赖性保持因为FD A-> BC
是关系R1(ABC)
的一部分。