TYPE table like "User_type table" 的目的是什么?

What is the purpose of TYPE table like "User_type table"?

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

我有 Table 用户 并且有列:

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


有人告诉我,我必须创建一个带有种子值的 Table User_type

  1. 管理员 [主要 ID: 1]
  2. 运营商[主 ID: 2]
  3. 维护者[主 ID: 3]

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


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

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

您所做的是正确的,但它会增加数据冗余,这意味着您在该列中一次又一次地使用相同的值。因此,对于这种情况,您可以使用规范化并分隔列中的数据。这样做有很多好处。就像您以后想将 "Admin" 更改为 "Administrator" 一样,您只需要更新一行。

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

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

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

你质疑这个要求是对的,因为你的同事显然没有解释清楚为什么它如此重要。

事实是数据库规范化中没有规则要求我们使用 伪密钥,这是一个整数,就像您的示例 Type_id.

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

但是规范化规则没有理由规定引用必须是整数。您可以将该查找的主键 table 设为字符串。

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)
);

那为什么你的 "someone" 告诉你必须使用整数 Type_id

好吧,可能有原因,但不是归一化规则造成的。

  • INTEGER 可能比VARCHAR(10) 中存储的字符串小,所以数据占用较少space。在 MySQL 中,一个 INTEGER 是四个字节。 VARCHAR 是 variable-length,具体取决于您存储的字符串。例如 "Admin" 需要五个字节,再加上一个字节来编码字符串的长度。所以它至少比 INTEGER 大 50%,更长的字符串需要更多 space。但这可能不值得优化,除非你存储了数亿用户。
  • 比较整数与整数比比较字符串稍快(特别是如果字符串具有二进制以外的字符集),但这是过早的优化。您是否要 运行 这些比较如此频繁以至于需要缩短几纳秒?也许吧,但你没说过。