数据库设计:在数据库中的用户表中,必须包含哪些字段?

11

我正在尝试为MySQL设计一个用户表。

目前,我的用户表看起来像这样

users (
BIGINT id,
VARCHAR(?) username,
VARCHAR(?) password,
VARCHAR(254) email,
DATETIME last_login,
DATETIME data_created
)

我还需要包括哪些字段?为什么需要它们?

上述字段应该排除哪些?为什么?

用户名和密码应该分配多少个字符?为什么?

id应该使用BIGINT吗?

预先感谢您的帮助。

补充说明:我将在社交网站中使用该表,因此“用户”表示全球人民。


你需要的字段严重取决于表的目的,而您没有提供。请更新您的问题,谢谢。 - janhink
3个回答

23

几点评论:

  1. BIGINT很好。我假设你将其用作替代键。在这种情况下,声明为

    BIGINT id primary key auto_increment,

    Mysql会在每次插入时自动分配一个唯一的int值给你的id(不要为此字段指定任何值)。永远不要尝试通过选择最大的id并将1添加到其中来实现此行为(我见过这样的情况很多次)。

  2. 用户名和密码的长度:这真的没有太大关系,只需选择一个长度。我倾向于标准化这些东西的255个长度varchars,但这并不基于任何经验。

  3. 将你的表命名为"user",而不是"users"。从概念上讲,表以与类实现实体相同的方式实现实体。您可能会创建一个名为"user"的类或数据结构,表名应与此对应。

  4. 我创建的每个表都有两个时间戳,“created”和“last_updated”。你已经完成了一半 :)

  5. 我认为我不会将last_login存储在用户表中,这可能是您想要在单独的表中记录的内容。将所有登录事件(登录、注销、失败的尝试、帐户锁定等)存储在日志表中是一个好主意。这将使您更好地了解系统正在做什么。


1
我认为将varchar长度设置为255对于名称来说是一种不好的做法。当然,这都取决于惯例,但是255往往会被用户和程序员误用甚至滥用。最好去搜索标准化长度。例如,对于名称,适当的最大长度应该是35或70(对于组合字段)。 - DerpyNerd
用户名应该只考虑最大长度小于255个字符,而不是"first_name"、"last_name"或"full_name"。我只是想补充一下,不是在暗示你的意思有所不同。关于姓名的好文章:https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ - Can Rau

6

1/ 用户名和密码:自行决定所需长度。

2/ BIGINT 可以使用,但整数可能已经足够。但请确保为 UNSIGNED 类型,并且最好是 AUTO_INCREMENT 类型。

3/尽量使用户表保持小:

users (
BIGINT id,
VARCHAR(?) username,
VARCHAR(?) password,
VARCHAR(254) email,
DATETIME data_created
)

剩余的内容,您可以将其放入额外的表格中:
logins (
BIGINT loginid
BIGINT userid
DATETIME last_login,
VARCHAR(15) IP_ADRESS
...
)

这样,当有新用户被添加或删除,或者有人更改密码时,您的用户表将仅会发生变化,这比有人登录频繁得多。这样可以更好地进行表缓存(MySQL在写入表时会清除表缓存)。


为什么要使用BIGINT?我同意你的建议,但这仅适用于用户数量巨大的系统。对于几千个用户来说,普通的表结构就足够了。 - halfdan
1
感谢您的建议,并教育我有关MySQL缓存策略的知识。 - Joon
那创建用户的人怎么办? - MaXi32

0

这完全取决于您自己的规格。对于用户名,如果您喜欢,可以使用100,对于密码,请使用您想要使用的哈希函数的长度(MD5为32)。

在表的主键上使用AUTO_INCREMENT和INTEGER(10)更为常见。

您可能想要询问姓名、姓氏、出生日期、居住地等信息。请考虑所有向用户请求的数据都应该与您正在构建的平台有关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接