网站用户模式设计

3

我需要创建一个数据库模式,用于存储用户信息(id、姓名、密码、电子邮件地址等)。在设置这些字段的大小时,我总是随意选择。因此,我有两个问题:

1)这些字段的好尺寸是什么?例如,电子邮件地址的最大长度肯定是有限制的。

2)现在我需要存储用户邮寄地址以进行信用卡购买,包括国际邮寄地址。这是我不想随意选择大小的领域。

是否有人知道一个好的模式?也许有一个项目可以做到这一点吗?

谢谢!

3个回答

1

我来帮你处理第一部分。通常情况下,你不必过于担心MySQL数据库字段的大小,你不需要完全准确地得到数字 - 只需确保有合理答案的人不会使他们的数据被截断即可。

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255),
`email` varchar(255),
`password` char(256)

请注意,对于密码字段,我使用的是256位字符字段而不是varchar字段。这是因为您永远不应该在数据库中存储明文密码。相反,您应该始终以某种唯一的“盐”格式将密码存储为散列格式。您可以在网上找到一些教程,密码字段的长度取决于您在密码上使用的哈希类型。

1
还要考虑使用哪个数据库引擎以及主键是电子邮件、行编号还是任意数字。通常我会在另一张名为“security”的表格中,使用像上面建议的哈希方式来保存密码。以下是一个示例。
CREATE TABLE IF NOT EXISTS `users` (
  `user_id` varchar(255) NOT NULL,
  `active` char(1) default 'Y',
  `created_date` INTEGER UNSIGNED default 0,
  `email` varchar(255) default NULL,
  `first_name` varchar(255) default NULL,
  `last_name` varchar(255) default NULL,
  `modified_date` INTEGER UNSIGNED default 0,
  PRIMARY KEY  (`user_id`, `active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

有趣。我以前从未见过两个字段被用作主键。你是如何使用“active”这种方式的? - Ethan
用户停用是可以的(我更喜欢不删除以保存其他表上的FK)。但是我不想限制其他人使用该用户ID。因此,只能有一个活动用户使用该用户ID。更好的例子是将电子邮件作为用户ID,因为当用户与ISP终止服务时,电子邮件可能会重复。 - AutoSponge

0

这是一个非常棘手的问题,因为在我看来,您“应该”允许的内容与IETF认为可以允许的内容之间存在差异。

最大允许的电子邮件地址长度为256个字符,其中包括电子邮件地址开头和结尾的斜杠(因此只有254个可用字符)。您可以在Dominic Sayers的此页面上找到详细的信息。

但是,真正有这么长的电子邮件地址的合法用户会有吗?

至于街道地址,我不认为有具体规定,但是根据世界上最长的网站,最长的街道名称为72个字符。因此,如果您将字段设置为100个字符,您将有足够的空间输入街道地址。

你不必过于担心每件事情都要做到百分之百正确,你应该更关注你决定接受进入数据库的数据质量(确保它是有效/干净的)。此外,如果有人输入了太长的内容,请提供清晰的拒绝信息,并确保网站所有者可以轻松联系到。

我想指出的一件事是,NoSQL现在非常流行,它使用无模式数据库引擎,例如MongoDBCouchDB。这并不是适用于所有问题的最佳解决方案,但如果你非常关注正确的模式,可能无模式数据库是一个不错的选择。


谢谢。这正是我在寻找的东西。我曾试图自己找到它,但显然使用了错误的搜索词。我已经看过NoSQL选项,但我认为MySQL更安全。目前,它们似乎对我支持它们的能力不够成熟。我知道Digg和其他网站正在使用它们,但他们有开发人员来内部支持这些应用程序。我需要一些简单可靠的东西来存储用户信息和上传的文件。你有什么想法? - Ethan
很高兴这能帮到你,我同意如果你对支持最新技术的能力不太自信,最好远离它,选择一个经过验证和可靠的系统。 - tplaner

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