我正在创建应用程序,我需要创建一个表来存储登录凭据。我一直在搜索互联网以确保我正确地执行此操作,但我认为最好在实施我的策略之前由您执行此操作。我将运行MySQL服务器端。
这就是我对用户表的看法。我不想使用'用户'因为它是保留的。我不想使用'用户'因为我的理解是你不希望复数作为表名。是'用户'例外?
CREATE TABLE usercredential
(
id int unsigned unique auto_increment,
username varchar(32) unique not null,
salt char(32) not null,
hash char(64) not null
);
使用了ID,因此用户可以更改用户名,而无需进入其他每个表并进行适当的更改。设置引用是否会删除具有唯一ID的需要?有没有理由在1以外的某个数字处启动唯一ID?
我将使用SHA256,因此散列长度为64就足够了。
问题:
提前谢谢。
答案 0 :(得分:0)
设置引用是否会删除具有唯一ID的需要?
那些是无关的问题。所有ID都应该是唯一的,无论它们如何使用。在一个表中进行一次字段更改并将该更改级联到其他表是一个单独的问题。您可以使用InnoDB引擎上的外键约束(简单)来实现这一点。
有没有理由在1以外的某个数字处启动唯一ID?
不,但是如果用户会看到他们的ID,您可能想要假装他们不是用户编号7.用户编号29837看起来更加成熟。
我应该是您的主键,用户名应该是您唯一的索引。
答案 1 :(得分:0)
首先,MySQL中未保留“user”。但是它位于SQL Server和Oracle。
我个人更喜欢以单数形式命名我的表格,而不是复数形式。然而,这只是个人风格的问题。不过,你应该保持一致!
以下是关于网络的一些讨论:
Table Naming Dilemma: Singular vs. Plural Names
Singular or plural database table names?
Plural vs Singular Table Name
有趣的是,这三个讨论对于他们接受的答案采用了不同的方法。
其次,您应该将id
设置为表的主键。作为主键,无论如何都会使它变得独一无二。然后,您将使用此列作为其他表中的外键。
我会在1开始id
,之后才在内部使用它。每当在前端引用该用户时,可以看到id
,我会使用username
,因为它也是唯一的。您也应该为username
列添加索引。这背后的原因是,你不能从单一的username
预测其他id
。但是,如果你有其中一个,你可以预测username
。
个人意见:我会将name
的名称更改为user.name
。重复列中的表名只会使查询不必要地更长。阅读比user.username
要好得多{{1}}。关于SO的讨论也是如此:Is prefixing each field name in a table with abbreviated table name a good practice?