数据库表 - 足够标准化?

时间:2011-06-28 19:25:39

标签: 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 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)
);

我想我需要规范化第一个表格,例如将第一个表拆分为某种user_info(first_name,last_name,...)和account(用户名,密码,role_id)。我遇到的问题是我很不确定为什么需要这样做,因为我无法解释为什么它不在3NF中。

编辑

用户只能拥有一个角色(admin,poweruser,user)。

3 个答案:

答案 0 :(得分:2)

如果用户可以拥有多个帐户或帐户可以拥有多个用户,则只需要分隔用户信息和帐户信息。如果用户与帐户的关系始终为1比1,那么您将按原样进行标准化。

如果很少使用第二个表中的列,偶尔将1:1关系中的列分开是有意义的。但是,在这种情况下,似乎总是会填充两个表,因此通过分离这些列没有任何好处。

答案 1 :(得分:2)

只有在允许拥有没有相应名字和姓氏的用户ID和用户名的情况下才进一步分解users表。否则看起来你的桌子已经在5NF了。

答案 2 :(得分:-1)

我不是SQL专家,但这些表看起来很规范。您应该规范化表格以节省空间:

如果您有一个列,例如role,并且您有20个用户拥有5个角色,则每个角色使用10个字节,您将拥有20 * 10bytes = 200bytes

但是,如果您已经对表格进行了规范化,那么您只需要5 * 10bytes = 50bytes作为角色名称,5 * 1byte = 5byte作为角色表中的ID,20 * 1byte = 20byte用户表中的id。

  • 200bytes未正常化
  • 标准化形式的
  • 50bytes + 20bytes + 5bytes = 75bytes

这只是一个非常不完整和基本的计算来显示背景。