2011-12-11 89 views
0

好的,直到今天我的印象是,在我的數據結構中有一個獨立的表是可以的,並且我有一張表來跟蹤來自IP的失敗登錄(所以我會跟蹤嘗試登錄的IP地址和然後阻止他們,如果他們有超過n attemps)SQL是數據庫結構中允許的獨立表嗎?

但今天我被我的教授告訴記者,這是不可能/右有此表作爲一個獨立的表,它必須有與其他表的關係,否則其錯誤。

現在我不能幫助,但這是表是獨立的,因爲它的目的不是與其他條目/表有關係。

我是對還是錯?並請解釋。

更多信息

當用戶嘗試登錄,但失敗的登錄嘗試的表被填滿。並且其主要依賴於用戶的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; 

,不知何故eventhough他不可能真正解釋他是如何,要我這個連接到用戶表。現在是這個錯誤?

+0

如果您存儲登錄名(userids,用戶名 - 不管您是否稱呼它),則可能與您的用戶表有關係,除非您還爲未知用戶登錄失敗的登錄名(例如,用戶名中存在拼寫錯誤) –

+0

我已更新問題 –

+0

我認爲這樣做的唯一方法是完全多餘的,就是在登錄嘗試表中添加一個PK,然後在登錄嘗試和用戶之間添加一個鏈接表。鏈接表只會保存成功登錄嘗試的記錄。但是,如果您沒有跟蹤此數據的要求,則這是不必要的。另一方面,它可能會滿足你的教授。 – jmacinnes

回答

2

如果您希望存儲的數據中沒有任何相關表格沒有任何存在錯誤,

但是,在上述情況下,我認爲您應該在Login_attempts表中存儲嘗試使用的用戶名和密碼。然後有一個鏈接表加入到存儲用戶名的表中。通過這種方式,如果特定的登錄名看起來受到攻擊(您可以使用它並從多個ips中獲得數千次嘗試),那麼可以輕鬆查看,以便可以修改該用戶。您還可以識別那些正在嘗試僞造用戶名的IP以及那些看起來不知道正確命題的IP。這可能會幫助您找到某些您想禁止嘗試登錄系統的IP。與實際用戶的連接可以幫助您查看錯誤嘗試是否來自不同的IP地址,而不是正確的登錄名。

+0

謝謝,幫了很多。我真的讓你在上面提到的功能...他們似乎很酷.. –

1

我從來沒有聽說過架構中的所有表都必須與某個表相關的要求。你的模式是什麼樣的?也許還有另一個問題。

+0

我已經更新了這個問題。讓我知道如果你仍然需要更多信息 –

2

一個數據庫當然可以有一個與任何其他表無關的表。可能你的教授只是說他不希望你實現你的特定任務。

如果您發佈了作業的詳細信息,我們可能會提供進一步的建議,但可能只有您的教授才能真正澄清這一點。

如果看起來您的教授希望您將其鏈接到用戶表,則需要添加一個將login_attempts錶鏈接到用戶表的列和外鍵約束。

爲了幫助您做到這一點,您應該看看Foreign Key Constraints in InnoDB上的mysql文檔(因爲您似乎在使用InnoDB)。

+0

我已經更新了這個問題。 –

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通過分解那是在一個較低的標準形式的表,你會一些表,你可以涉及你失敗的登錄表。但是我沒有在你的描述中看到這些。