没有任何理由使用客户端 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 的网站了解一些代码示例),然后向用户显示该信息。无需用 JavaScript 编写数据库引擎的执行速度将提高几个数量级。
编辑2:根据第二条评论,检查一个项目是否已经在数据库中
我在第一次编辑中所说的几乎所有内容都适用,除了两个更改:模式和查询。该模式应该成为我发布的两个模式中的第二个,因为您不希望数据库引擎允许重复。此外,查询应该很简单
SELECT COUNT(*) > 0
FROM MentorRelationship
WHERE mentorID = @mentorID AND menteeID = @menteeID;
where@mentorID
和@menteeID
是用户选择的项目,并通过查询构建器库而不是通过字符串连接插入到查询中。然后,如果该项目已经在数据库中,则服务器将获得真值,否则将获得假值。服务器可以像以前一样通过 AJAX 将其发送回客户端,如果项目已经在数据库中,客户端(即您的 JavaScript 页面)可以提醒用户。