TYPE table like "User_type table" 的目的是什么?
What is the purpose of TYPE table like "User_type table"?
我不确定 header 问题。只是为了详细说明。
我有 Table 用户 并且有列:
- 名称(示例值:"Meg"、"Sam" 等)
- 类型(示例值:"Admin"、"Operator"、"Maintainer")
- 图片(示例值:“12344.jpg”等)
- 等等
有人告诉我,我必须创建一个带有种子值的 Table User_type。
- 管理员 [主要 ID: 1]
- 运营商[主 ID: 2]
- 维护者[主 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。但这可能不值得优化,除非你存储了数亿用户。
- 比较整数与整数比比较字符串稍快(特别是如果字符串具有二进制以外的字符集),但这是过早的优化。您是否要 运行 这些比较如此频繁以至于需要缩短几纳秒?也许吧,但你没说过。
我不确定 header 问题。只是为了详细说明。
我有 Table 用户 并且有列:
- 名称(示例值:"Meg"、"Sam" 等)
- 类型(示例值:"Admin"、"Operator"、"Maintainer")
- 图片(示例值:“12344.jpg”等)
- 等等
有人告诉我,我必须创建一个带有种子值的 Table User_type。
- 管理员 [主要 ID: 1]
- 运营商[主 ID: 2]
- 维护者[主 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。但这可能不值得优化,除非你存储了数亿用户。
- 比较整数与整数比比较字符串稍快(特别是如果字符串具有二进制以外的字符集),但这是过早的优化。您是否要 运行 这些比较如此频繁以至于需要缩短几纳秒?也许吧,但你没说过。