在声明表(例如 USER)的主键 (PK) 时,有几个选项:
现有字段 (
username
) 可以作为主键(自然键)放置,因此将验证用户名,以便没有其他相等。例如:CREATE TABLE usuarios( username VARCHAR(30) not null; password VARCHAR(30) not null; tipo_u VARCHAR(10) null; PRIMARY KEY(username) ) ENGINE INNODB
iduser
可以添加一个新字段 ( ) 作为主键(代理键),如果需要,可能会自动递增。例如:CREATE TABLE usuarios( iduser INT not null AUTO_INCREMENT; username VARCHAR(30) not null; password VARCHAR(30) not null; tipo_u VARCHAR(10) null; PRIMARY KEY(iduser) ) ENGINE INNODB
是否更推荐两者之一?这两种方法中的哪一种可以在数据库中获得更好的性能?每种方法带来什么优势?
使用 iduser 是否更安全?我真的看不出它有多大用处,但我看到很多网站都这样使用它。
实际上,您选择的方式将取决于您要在数据库中进行的设计。
将自动递增的数字 ID 添加到表(代理键)而不是使用现有字段(自然键)的问题是一个备受讨论的话题,有其支持者和反对者,因为这两种方法都有其优点和缺点。。
让我们看看这两种情况的一些优缺点:
代理键(添加自动增量 iduser)
优势:
缺点:
int
它是 4 个字节)......尽管这通常由稍后节省的空间来补偿(见上文)。SELECT
,现在您将不得不添加更多字段并与子表连接。自然键(使用用户名作为键)
优势:
SELECT
虽然要小心:这对人类来说是一个优势,但只要它有效,数据库就不会关心你的可读性。缺点:
与所有事情一样,总会有人决定其中一个。就个人而言,我更喜欢代理键,因为根据过去的经验,我发现它们更灵活,并且随着数据库的增长占用的空间明显减少。
我将给你两个我过去发现的例子,适用于你的案例:
占用更少空间的代位键
在您的情况下,用户 ID 将是
int
4 字节字符,用户名将是varchar(30)
31 字节字符(1 表示大小 + 30 表示字符)。如果添加用户 ID,您将在原始表中再添加 4 个字节,但在另一个表中用作外键的每一行中,在最坏的情况下(以及在计算中),您将节省 27 个字节 (31-4)你总是必须采取最坏的情况)。
这意味着一旦您将 cad userid 作为表中的外键,您就已经将添加的权重保存在初始表中。
代理键更灵活
想象一下,您有一个包含数十个表和数千(或数百万)条记录的数据库,其中许多与用户相关,并且以用户 ID/用户名作为外键。现在假设您让用户决定他想要更改他的用户名(他通过了)。发生什么事?
ON UPDATE CASCADE
为自己完成了工作......但情况并非总是如此。还有一个很接近的例子:Stack Overflow 允许您每月更改一次用户名(我认为)。他们有一个用户 ID 密钥系统(你的是 34527)作为主键,然后用户名作为一个单独的字段,这对他们来说更容易更改。
1) 用户名不能自动递增,考虑到它是一个
varchar
并且用户名将通过表单输入。2) 用户名可以是 as
PRIMARY KEY
或 asUNIQUE
在创建与其他表的关系时,可以看到使用 int 类型的 id 的优势。它还使您可以轻松搜索多个用户。
例如:
你不能用 user 做的事情
varchar(30)
。建议同时使用。iduser 的 PRIMARY KEY 和用户名的 UNIQUE
请注意,
username
它设置为UNIQUE
这可以防止用户名被重复。UNIQUE 的优点是您可以UNIQUE
在同一个表中拥有多个字段,这与PRIMARY KEY
.说实话,在您公开的两种形式中,数据库级别的性能没有区别,因为在 SQL 查询中,它优先考虑具有索引的列,如果它是主键索引则更是如此。即:
如果username列是表的 PK,它的where是优先的,而 userFecCreacion,因为它不是一个有索引的列,所以没有。
我可以限制的是,在您提出的第一种情况下,用户名 VARCHAR(30),它不是最优的,因为类型没有帮助,而不是 Varchar(因为该字段是变量)我会使用 Char。干杯
您必须使用身份,这将使其唯一并自动递增
CREATE TABLE 用户(iduser INT 身份;用户名 VARCHAR(30) not null UNIQUE;密码 VARCHAR(30) not null;u_type VARCHAR(10) null;
主键(iduser))