Java 规范化数据库的优点是什么?
我真的不能很好地理解这一点。我在网上看到了很多例子,但没有解释原因。例如,应用程序中有两种用户:客户和经理。创建单独的“用户类型”表而不是将“用户类型”列合并到用户表中有什么好处。另一个示例是为产品的类别创建单独的表,而不是将“类别”字段放在产品表中。我真的无法理解这件事。db规范化的优点是什么?数据库中重复数据的缺点是什么 重复数据的缺点是,您必须记住所有数据副本的位置,并在信息更改时更新所有副本。规范化更多的是重复数据消除,而不是创建单独的表Java 规范化数据库的优点是什么?,java,database-design,relational-database,entity-relationship,Java,Database Design,Relational Database,Entity Relationship,我真的不能很好地理解这一点。我在网上看到了很多例子,但没有解释原因。例如,应用程序中有两种用户:客户和经理。创建单独的“用户类型”表而不是将“用户类型”列合并到用户表中有什么好处。另一个示例是为产品的类别创建单独的表,而不是将“类别”字段放在产品表中。我真的无法理解这件事。db规范化的优点是什么?数据库中重复数据的缺点是什么 重复数据的缺点是,您必须记住所有数据副本的位置,并在信息更改时更新所有副本。规范化更多的是重复数据消除,而不是创建单独的表 在您的user_类型示例中,您可以将其放在use
在您的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”时适用。无法在内部强制执行此操作——必须使用触发器和/或应用程序代码
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表中插入一条记录即可。现有代码不受影响。当然,应用程序代码最终将不得不更改以处理新类型,但应用程序开发人员现在可以在空闲时这样做
不要只为当前的需求而设计。还应针对合理预期的未来需求进行设计。创建用户类型表而不是单个列与规范化无关。