我正在尝试为MySQL设计一个用户表。
现在,我的用户表看起来像这样
users (
BIGINT id,
VARCHAR(?) username,
VARCHAR(?) password,
VARCHAR(254) email,
DATETIME last_login,
DATETIME data_created
)
我还应该包括哪些其他字段以及为什么需要它们?
我应该从上面排除哪些字段?为什么?
我应该为用户名和密码分配多少个字符,为什么?
我应该使用BIGINT作为id吗?
提前感谢您的帮助。
ADDED 我打算将这个表用于社交网站,因此“用户”指的是世界各地的人们。
答案 0 :(得分:11)
一些评论:
BIGINT很好。我假设你正在使用它作为代理键。在这种情况下,将其声明为
BIGINT id主键auto_increment,
每当执行插入操作时,Mysql都会自动为您的id分配一个唯一的int值(不要为此字段指定任何值)。不要试图通过选择最大ID并向其添加1来实现此行为(我已经多次看到过这种情况)。
用户名和密码的长度:这真的没什么大不了的,只需选择一个长度。我倾向于为这些东西标准化255个长度变量,但这不是基于经验的任何东西。
将您的表格称为“用户”,而不是“用户”。从概念上讲,表以与实现实体相同的方式实现实体。您可能会创建一个名为“user”的类或数据结构,表名应与此对应。
我创建的每个表都有两个时间戳,“created”和“last_updated”。你在那里:)
我认为我不会将last_login存储在用户表中,这可能是您要在单独的表中登录的内容。在登录表中存储所有登录事件(登录,注销,失败尝试,帐户锁定等)是个好主意。这将使您更好地了解系统一直在做什么。
答案 1 :(得分:3)
1 /用户名和密码:自己决定你想要的大小。
2 / BIGINT很好,即使整数可能就足够了。但是也可以将它设为UNSIGNED,也可以是AUTO_INCREMENT。
3 /尽量保持您的Users表尽可能小:
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在写入表时清除表缓存)。
答案 2 :(得分:0)
所有这些都取决于您自己的规格。对于用户名,如果您愿意,可以取100,因为密码取您想要使用的散列函数的长度(对于MD5为32)。
在表的主键上使用带有AUTO_INCREMENT的INTEGER(10)更为常见。
您可能想要询问姓名,姓氏,出生日期,居住地等。请认为您要求用户提供的所有数据对您正在构建的平台而言应该是某种重要的。