Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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
Mysql 数据库表-是否足够规范化?_Mysql_Database_Normalization - Fatal编程技术网

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,你是对的,不知道我是如何做到这一点的,也许我应该睡一觉,但是:这么多的代码,这么少的时间……规范化是关于数据的完整性和准确表示。这与节省空间无关。