Mysql 数据库表-是否足够规范化?
下面是我为管理用户帐户而设计的两个表Mysql 数据库表-是否足够规范化?,mysql,database,normalization,Mysql,Database,Normalization,下面是我为管理用户帐户而设计的两个表 create table if not exists users ( id int unsigned not null auto_increment, username varchar(100) not null, password binary(60) not null, first_name varchar(100) not null, last_name varchar(100) not null, role_id int un
create table if not exists users (
id int unsigned not null auto_increment,
username varchar(100) not null,
password binary(60) not null,
first_name varchar(100) not null,
last_name varchar(100) not null,
role_id int unsigned not null,
primary key(id),
unique(username)
);
create table if not exists roles (
id int unsigned not null auto_increment,
role varchar(100) not null,
primary key(id),
unique(role)
);
我认为我需要规范化第一个表,例如,将第一个表拆分为某种类型的用户信息(名字、姓氏等)和帐户(用户名、密码、角色id)。我的问题是,我很不确定为什么我需要这样做,因为我无法真正解释为什么它不在3NF中
编辑
一个用户只能有一个角色(admin、poweruser、user)。我不是SQL专家,但这些表在我看来非常规范化。应规范化表格以节省空间: 如果您有一个列,如
role
,并且您有20个用户和5个角色,每个角色使用10字节,那么您将有20*10字节=200字节
但是,如果您已经对表进行了规范化,那么角色名称只需要5*10bytes=50bytes
,角色表中的id需要5*1byte=5byte
,用户表中的id需要20*1byte=20byte
未规范化200字节
标准化格式李>50bytes+20bytes+5bytes=75bytes
这只是显示背景的一个非常不完整的基本计算。如果一个用户可以有多个帐户,或者一个帐户可以有多个用户,则只需要将用户信息和帐户信息分开。如果用户与帐户的关系始终是1对1,那么您将按原样进行规范化
有时,如果第二个表中的列很少使用,则按1:1关系分隔列是有意义的。然而,在这种情况下,似乎两个表都会被填充,所以分离这些列并没有什么好处。仅当允许用户id和用户名没有相应的名字和姓氏时,才进一步分解用户表。否则,看起来您的表已经在5NF中了。我认为这个问题没有合适的客观答案。我个人的观点是,规范化您的
用户
表没有任何好处。@djacobson:开发正式数据模型的原因之一是为判断表结构提供客观依据。(数据的关系模型是一个正式的数据模型。)根据提供的信息,“用户”表位于5NF中。不需要发表意见。你还必须规范化其他情况:例如,城市,这是一种1:1的关系,但通常情况下,数据库中的用户比城市多。@Thomas Berger:我不认为人们与城市的关系可能是1:1。几乎按照定义,一个城市包含多个人。sry,你是对的,不知道我是如何做到这一点的,也许我应该睡一觉,但是:这么多的代码,这么少的时间……规范化是关于数据的完整性和准确表示。这与节省空间无关。