像“ User_type table”这样的TYPE表的目的是什么?

时间:2019-07-14 18:52:15

标签: mysql database database-normalization

我不确定标题问题。只是为了详细说明。

我有表用户,并有列:

  1. 名称(示例值:“ Meg”,“ Sam”等
  2. 类型(示例值:“ Admin”,“ Operator”,“ Maintainer”
  3. 图片(示例值:“ 12344.jpg”等
  4. 等等。


我曾经有人告诉过我,我必须创建一个具有种子值的表 User_type

  1. 管理员 [主要ID:1]
  2. 操作员 [主要ID:2]
  3. 维护者 [主要ID:3]

并将列 Type 更改为 Type_id ,并将其引用到 User_type表。而不是插入字符串值 [“ Admin”,“ Operator”等] 。现在,我为Admin输入整数1,为操作员插入2,为维护者插入3。


我不记得他对此的解释。现在我很困惑。

  • 这真的对数据库至关重要吗?
  • 有人可以解释或阐述我的逻辑吗?
  • 字符串值与整数值,怎么回事?

希望有人能启发我,我是数据库设计的初学者。

2 个答案:

答案 0 :(得分:2)

您对这一要求提出质疑是正确的,因为您的同事显然并没有清楚解释为什么如此重要。

事实是,数据库规范化中没有规则要求我们使用 pseudokey ,该规则类似于您的Type_id示例。

创建一个User_type查找表是一个好主意,这样您就可以得到系统允许的用户类型的简明列表。如果添加新类型,则只需在该查询表中插入一行,然后引用该查询表的Users表将被允许使用新类型。

但是归一化规则没有理由要求引用必须是整数。您可以将查找表的主键设置为字符串。

CREATE TABLE User_type (
  Type VARCHAR(10) NOT NULL PRIMARY KEY
);

CREATE TABLE Users (
 ...
 Type VARCHAR(10) NOT NULL,
 FOREIGN KEY (Type) REFERENCES User_type(Type)
);

那为什么您的“某人”告诉您必须使用整数Type_id

嗯,可能有原因,但这不是归因于规范化规则。

  • INTEGER可能小于存储在VARCHAR(10)中的字符串,因此数据将占用较少的空间。在MySQL中,INTEGER是四个字节。 VARCHAR是可变长度的,具体取决于您存储的字符串。例如,“ Admin”需要五个字节,外加一个字节来编码字符串的长度。因此,它至少比INTEGER大50%,并且更长的字符串会占用更多空间。但这可能不值得优化,除非您存储了数亿用户。
  • 将整数与整数进行比较要比比较字符串稍快(特别是如果字符串具有除二进制以外的字符集),但这是过早的优化。您是否会经常进行这些比较,以至于需要将时间缩短几纳秒?也许吧,但您没有这么说。

答案 1 :(得分:0)

您所做的是正确的,但是它将增加数据冗余,这意味着您在该列中一次又一次使用相同的值。因此,在这种情况下,您可以使用规范化并将列中的数据分开。有很多优点。就像您以后要将“管理员”更改为“管理员”一样,则只需更新一行。

https://en.wikipedia.org/wiki/Data_redundancy

https://en.wikipedia.org/wiki/Database_normalization

数据冗余和数据库规范化是RDBMS的基本概念。