有沒有任何理由使用客戶端的JavaScript/jQuery來從數據庫中刪除重複。除了安全問題(還有很多這些問題),還有一種更簡單的方法來確保數據庫中的條目是唯一的:使用SQL。
SQL能夠表達要求表列中不存在重複的要求,並且數據庫引擎會爲您執行該操作,絕不會讓您在首位插入重複條目。數據庫引擎的語法稍有不同,但是無論何時創建表,都可以指定一列必須是唯一的。
讓我們使用SQLite作爲我們的示例數據庫引擎。
CREATE TABLE Person(
id INTEGER PRIMARY KEY ASC,
-- Other fields here
);
CREATE TABLE MentorRelationship(
id INTEGER PRIMARY KEY ASC,
mentorID INTEGER,
menteeID INTEGER,
FOREIGN KEY (mentorID) REFERENCES Person(id),
FOREIGN KEY (menteeID) REFERENCES Person(id)
);
但是,你可以強制唯一性,即要求任何(mentorID, menteeID)
對是唯一的,通過改變對(mentorID, menteeID)
是主鍵:你的問題的相關部分,現在大概有桌子這樣的事情表示。這是有效的,因爲你只允許每個主鍵的一個副本。然後,MentorRelationship
表變爲
CREATE TABLE MentorRelationship(
mentorID INTEGER,
menteeID INTEGER,
PRIMARY KEY (mentorID, menteeID),
FOREIGN KEY (mentorID) REFERENCES Person(id),
FOREIGN KEY (menteeID) REFERENCES Person(id)
);
編輯:按照註釋,提醒用戶重複,但不會真正刪除它們
這仍與SQL比用JavaScript好得多。當你在JavaScript中這樣做時,你一次只讀一個數據庫行,通過網絡發送它,等待它來到你的頁面,處理它,扔掉它,然後請求下一個。使用SQL,所有艱苦的工作都是由數據庫引擎完成的,並且不會通過網絡傳輸不必要的數據而浪費時間。使用第一套表定義上面,你可以寫
SELECT mentorID, menteeID
FROM MentorRelationship
GROUP BY mentorID, menteeID
HAVING COUNT(*) > 1;
這將返回所有出現不止一次的(mentorID, menteeID)
對。
一旦你有這樣的查詢在服務器上工作(並且還提取出你想要顯示給用戶的所有信息,這可能不僅僅是一對ID),你需要發送這個網絡到用戶的網頁瀏覽器。本質上,在服務器端映射URL以便以某種方便的形式(JSON,XML等)返回此信息,並且在客戶端,您可以通過使用AJAX調用聯繫該URL來閱讀此信息(有關代碼,請參見jQuery's website示例),然後將該信息顯示給用戶。無需在JavaScript中編寫數據庫引擎將以更快的速度執行幾個數量級。
編輯2:按照第二條評論,檢查項目是否已經在數據庫
幾乎所有的東西我在第一個編輯說適用,除了兩個變化:架構和查詢。該模式應該成爲我發佈的兩個模式中的第二個模式,因爲您不希望數據庫引擎允許重複。此外,查詢應該是簡單的
SELECT COUNT(*) > 0
FROM MentorRelationship
WHERE mentorID = @mentorID AND menteeID = @menteeID;
其中@mentorID
和@menteeID
是用戶選擇的項目,並插入一個查詢構建器庫和not by string concatenation查詢。然後,如果該項目已在數據庫中,則服務器將獲得真實值,否則將爲false。服務器可以像以前一樣通過AJAX將其發送回客戶端,並且客戶端(即您的JavaScript頁面)可以在用戶已經在數據庫中時提醒用戶。
爲什麼你使用JavaScript進行數據庫邏輯? – 2012-04-29 00:15:40
@AdamMihalcin node.js? – 2012-04-29 00:16:05
我有Coldfusion處理數據庫查詢,但我們使用的JQuery需要從查詢返回的字段。 – Brian 2012-04-29 00:19:13