SQL是数据库结构中允许的独立表吗?

时间:2011-12-11 13:48:13

标签: mysql sql database

好的直到今天我的印象是在我的数据结构中有一个独立的表是可以的,我有一个表来跟踪来自IP的失败登录(所以我会跟踪尝试登录的IP)然后阻止它们,如果它们有超过n尝试次数

但是今天我的教授告诉我,将这张桌子作为一张独立的桌子是不可能/权利的,而且它必须与其他桌子有关系,否则就错了。

现在我无法帮助,但是这个表是独立的,因为它的目的不是与其他条目/表有关系。

我是对还是错?请解释一下。

更多信息

当用户尝试登录但失败时,将填写登录尝试表。并且它主要依赖于用户的IP,因此如果用户未能获得正确的密码n次,则表中将有n个条目,并且x将阻止访问} 分钟。这就是桌子的目的,但不知何故,我的ERD被批评我的教授独自站着一张桌子(我被告知“我在这个领域工作的这些年里从未见过一个桌子站立”)和我仍然不确定他是否正确。这是表结构:

CREATE TABLE IF NOT EXISTS `login_attempts` (
  `ip` varchar(20) DEFAULT NULL,
  `attempts` int(11) DEFAULT '0',
  `lastlogin` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

以某种方式尽管他无法解释如何,他希望我将其连接到用户表。现在这是错的吗?

4 个答案:

答案 0 :(得分:2)

数据库当然可以有一个与任何其他表无关的表。可能你的教授只是说这不是他希望你实现你的特定任务的方式。

如果您发布作业的详细信息,我们可能会提供进一步的建议,但可能只有您的教授才能真正澄清这一点。

如果看起来您的教授希望您将其链接到users表,则需要添加一个列和一个将login_attempts表链接到users表的外键约束。

有关这方面的帮助,您应该查看Foreign Key Constraints in InnoDB上的mysql文档(因为您似乎正在使用InnoDB)。

答案 1 :(得分:2)

在您要存储的数据中没有相关表的表没有任何问题。

但是在上面的情况中,我认为您应该在Login_attempts表中存储尝试的用户名和密码。然后有一个链接表加入到存储用户名的表中。通过这种方式,您可以轻松查看某个特定的登录名是否会被泄露(您正在尝试使用它和从多个ips进行数千次尝试),因此可以通知用户更改它。您还可以识别那些尝试虚假用户名的IP以及那些似乎不知道正确paasword的IP。这可能有助于找到您想要禁止尝试登录系统的某些IP。与实际用户的连接可以帮助您查看不良尝试是否来自不同的IP地址而不是良好的登录。

答案 2 :(得分:1)

我从未听说过要求模式中的所有表必须以某种方式与另一个表相关。你的架构是什么样的?也许还有另外一个问题。

答案 3 :(得分:1)

按IP地址登录失败的最小表只有两列:ip地址和时间戳。实际上,您可能需要使用不同的数据类型,主要取决于时间戳的分辨率。

create table failed_logins (
  ip_address inet not null,
  failed_at timestamp not null default current_timestamp,
  primary key (ip_address, failed_at)
);

这样的表将是“所有键”,它将在5NF中。它与其他表没有任何关系。

现在,如果你通过分解低级正常形式的表将这个表放到5NF中,你有一些表 可以将失败的登录表与。但是我在你的描述中没有看到这些。

相关问题