Java 规范化数据库的优点是什么?

Java 规范化数据库的优点是什么?,java,database-design,relational-database,entity-relationship,Java,Database Design,Relational Database,Entity Relationship,我真的不能很好地理解这一点。我在网上看到了很多例子,但没有解释原因。例如,应用程序中有两种用户:客户和经理。创建单独的“用户类型”表而不是将“用户类型”列合并到用户表中有什么好处。另一个示例是为产品的类别创建单独的表,而不是将“类别”字段放在产品表中。我真的无法理解这件事。db规范化的优点是什么?数据库中重复数据的缺点是什么 重复数据的缺点是,您必须记住所有数据副本的位置,并在信息更改时更新所有副本。规范化更多的是重复数据消除,而不是创建单独的表 在您的user_类型示例中,您可以将其放在use

我真的不能很好地理解这一点。我在网上看到了很多例子,但没有解释原因。例如,应用程序中有两种用户:客户和经理。创建单独的“用户类型”表而不是将“用户类型”列合并到用户表中有什么好处。另一个示例是为产品的类别创建单独的表,而不是将“类别”字段放在产品表中。我真的无法理解这件事。db规范化的优点是什么?数据库中重复数据的缺点是什么

重复数据的缺点是,您必须记住所有数据副本的位置,并在信息更改时更新所有副本。规范化更多的是重复数据消除,而不是创建单独的表


在您的user_类型示例中,您可以将其放在user表的一列中。如果用户可以有多个用户类型,那么附加表就很方便了

规范化的目的是防止异常数据进入数据库

例如,以一个非常简单的用户实体为例:

create table Users(
  ID        int auto_generated primary key,
  LastName  varchar( 16 ) not null,
  FirstName varchar( 16 ) not null
);
现在发现有两种类型的用户:Manager(M)或paun(p)。此外,对于经理,我们需要知道有多少人直接向他们汇报,对于员工,我们需要知道他们是否拥有叉车许可证。让我们把它放到桌子上:

create table Users(
  ID           int auto_generated primary key,
  LastName     varchar( 16 ) not null,
  FirstName    varchar( 16 ) not null,
  UserType     char( 1 ) not null,
  DirectReps   int,
  HasFLLicense boolean
);
这会让你脑子里的各种警报响起。什么会出错

  • UserType的唯一有效值(此时)是'M'或'P'。但是,此字段可以包含任何单个字符。我们可以在这个专栏上创建一个“检查”,但这会产生另一个问题,我将在后面讨论
  • DirectReps和HasFLLicense字段仅在UserType字段分别包含“M”或“P”时适用。无法在内部强制执行此操作——必须使用触发器和/或应用程序代码
没有简单的方法来实施这些新的约束。我们都知道,无论我们多么小心,迟早我们会在DirectReps或HasFLLicense中不适当地使用除“M”或“P”以外的用户类型值和/或值。这是异常数据

如果仔细观察,字段LastName、FirstName和UserType仅对ID具有功能依赖性。但是,DirectReps和HasFLLicense也依赖于UserType。这个新表不在2nf中

规范化这个表有几种不同的方法,所以我就不赘述了。(这是我今天早些时候介绍的一种方法。)不用说,最终结果应该是,除非UserType值为“M”,否则DirectReps值不存在,除非UserType值为“P”,否则HasFLLicense值不存在

现在让我们看一下规范化表:

create table Users(
  ID           int auto_generated primary key,
  LastName     varchar( 16 ) not null,
  FirstName    varchar( 16 ) not null,
  UserType     char( 1 ) check( UserType in( 'M', 'P' )
);
有一些规范化方法也可以从表中删除
UserType
字段,但现在让我们把它留在这里。以下内容适用于任何位置

当你认为迟早会需要第三种类型时,问题就出现了。在不同的点上,一个接一个,你就知道了。每次我们都必须发出一个
altertable
命令来重写check约束。这就像完全拆毁和重建你的家,只是为了取代你的客厅沙发。访问此表(包括视图)的所有代码至少必须重新编译并可能重写。让我们面对它,
altertable
是一个非常重要的操作

拥有一个包含每种用户类型记录的查找表会有多好:

create table UserTypes(
  ID      char( 1 ) not null primary key, -- 'M' or 'P' or whatever
  Name    varchar( 16 ) not null,  -- "Manager" or "Peon" or whatever
  ...     -- other possible attributes
);
然后可以定义
UserType
字段:

  UserType     char( 1 ) not null references UserTypes( ID )
现在添加一个类型“a”或“F”或任何东西只需在UserTypes表中插入一条记录即可。现有代码不受影响。当然,应用程序代码最终将不得不更改以处理新类型,但应用程序开发人员现在可以在空闲时这样做


不要只为当前的需求而设计。还应针对合理预期的未来需求进行设计。

创建用户类型表而不是单个列与规范化无关。