Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 将表规格化为5 NF_Database_Relational Database_Normalization - Fatal编程技术网

Database 将表规格化为5 NF

Database 将表规格化为5 NF,database,relational-database,normalization,Database,Relational Database,Normalization,我很难决定一个关系是否应该标准化为5nF 假设我有一个全关键关系,包括: A*,B*,C,D A和B是另一个表中的外键,该表的主键为A和B C可以是X1,X2,X3 D可以是Y1,Y2,Y3 在关系式中,C和D是彼此的组合 示例数据: create table t1(A,B,C); create table t2(A,B,D); insert into t1 values (1,2,'X1'), (3,4,'X2'), (5,6,'X1'), (7,8,'X2'); insert into t

我很难决定一个关系是否应该标准化为5nF

假设我有一个全关键关系,包括:

A*,B*,C,D

A和B是另一个表中的外键,该表的主键为A和B C可以是X1,X2,X3 D可以是Y1,Y2,Y3 在关系式中,C和D是彼此的组合

示例数据:

create table t1(A,B,C);
create table t2(A,B,D);

insert into t1 values (1,2,'X1'), (3,4,'X2'), (5,6,'X1'), (7,8,'X2');
insert into t2 values (1,2,'Y2'), (3,4,'Y2'), (5,6,'Y3'), (7,8,'Y1');

select * from t1 natural join t2; 

A           B           C           D
----------  ----------  ----------  ----------
1           2           X1          Y2
3           4           X2          Y2
5           6           X1          Y3
7           8           X2          Y1
1,2,X1,Y2 3,4,X2,Y2 5,6,X1,Y3 7,8,X2,Y1 将此关系规范化为以下内容是否有意义:

A、 B,C A、 B,D C、 D
如果包含C,D的关系包含所有可能的组合

如果A,B是关系中的一个键,假设这是由星星指示的,那么它已经在4NF中,因为C和D在功能上都依赖于A,B。那么分解成5NF就是

(A,B,C)
(A,B,D)
您不需要进一步的关系C、D。快速检查SQL可确认示例数据:

create table t1(A,B,C);
create table t2(A,B,D);

insert into t1 values (1,2,'X1'), (3,4,'X2'), (5,6,'X1'), (7,8,'X2');
insert into t2 values (1,2,'Y2'), (3,4,'Y2'), (5,6,'Y3'), (7,8,'Y1');

select * from t1 natural join t2; 

A           B           C           D
----------  ----------  ----------  ----------
1           2           X1          Y2
3           4           X2          Y2
5           6           X1          Y3
7           8           X2          Y1
至于分解到您的关系是否有意义:一般来说,我会选择确保最大数据一致性的关系设计。在您的情况下,从4NF到5NF不会保护您免受任何进一步的插入/更新/删除异常。您只需水平地对数据进行分区,从关注点分离的角度来看,这可能是有意义的,但从数据一致性的角度来看,这不是必需的

编辑:添加了针对关键点为A、B、C、D的案例的讨论

如果A、B、C、D是关系中的关键,并且数据中的项目联接依赖项是您在问题R=A、B、C*A、B、D*C、D中提出的依赖项,不仅针对示例数据,而且作为数据完整性规则,然后5NF模式将强制您的数据一致性,而您的原始模式将不会。您可以有insert/update/delete异常。因此,从逻辑的角度来看,应该使用5NF模式,否则必须在应用程序级别强制执行数据完整性


与通常情况一样,对于3NF,也可能有特定的性能要求迫使您对模式进行非规范化,例如,在查询数据时保存联接,但除非被迫这样做,否则我始终会选择最好的概念模式。对于许多DBMS,查询性能甚至可以在物理级别上为5NF设计改进,例如,使用适当的索引和/或增量物化视图,而无需放弃适当的逻辑关系设计。但当然,在某些情况下,您可能不得不以一致性换取性能或空间效率

分解成A,B,C和A,B,D就足够5NF了,假设A,B是你们关系中的关键,见下文。费边,非常感谢你们的回答,我想这让我找到了答案。我在SQL中尝试了一个连接,按照您的建议,我的数据被拆分为两个表,结果得到了虚假的元组,所以这对我来说意味着表需要保持原样。当我分裂成3张桌子时,我得到了与我最初所想的相同的结果。我认为有区别的是主键是由A,B,C,D组成的,而不仅仅是A,B。任何进一步的反馈来确认或否定我的结论都是非常受欢迎的:哦,我明白了。我认为A,B是你们关系的关键。我已经重新添加了我以前的答案文本,我想在我认为A,B是关键之前把它放进去;希望对您有所帮助。