我有以下数据库架构。
SQL> describe USERS;
Name Null? Type
----------------------------------------- -------- ----------------------------
user_id NOT NULL NUMBER(38)
name NOT NULL VARCHAR2(50)
password NOT NULL VARCHAR2(50)
score NUMBER(38)
notify_before_expiration NUMBER(38)
is_admin NOT NULL NUMBER(1)
SQL> describe EMAIL;
Name Null? Type
----------------------------------------- -------- ----------------------------
email_id NOT NULL NUMBER(38)
email NOT NULL VARCHAR2(50)
user_id NOT NULL NUMBER(38)
所以一个用户有很多电子邮件。 用户可以访问他们可以添加/删除他们的电子邮件的表单。 问题是:更新具有从此表单获取的邮件列表的数据库的更好方法是什么?
我在想:(java伪代码)
//List of mails in db.
ArrayList<String> emailsInDB = getAllMailsFromDB(user);
//List of mails from the form
ArrayList<String> emailsInForm = form.getAllMails();
//Iterates all emails gotten from the form.
for (String email : emailsInForm) {
if (emailsInDB.contains(email) {
//Already in the db
emailsInDB.remove(email, user);
} else {
//New mail! Add it in the db!
db.insertMail(email, user);
}
//All emails that were in the db, but not in the form,
//were deleted. Delete them from the db.
for (String email : emailsInDB) {
db.deleteMail(email);
}
欢迎更好的想法! 谢谢你的阅读。
答案 0 :(得分:3)
您可以进行的一项优化是在插入新电子邮件之前先删除电子邮件
在伪SQL中:
DELETE from emails WHERE emali.user_id=userid AND email NOT IN(...list of emails from the form...)
删除所有需要在SQL服务器调用中删除的电子邮件,如果您收到大量电子邮件并且服务器距离很远,则可以节省一些延迟。
然后继续插入电子邮件
//List of mails in db.
ArrayList<String> emailsInDB = getAllMailsFromDB(user);
//Iterates all emails gotten from the form.
for (String email : emailsInForm) {
if (!emailsInDB.contains(email) {
//New mail! Add it in the db!
db.insertMail(email, user);
}
答案 1 :(得分:2)
虽然没有详细记录,但Oracle允许您定义一种名为VARRAY的数组。通过这些,您可以批量传递'emailsToAdd'和'emailsToDelete'的程序。这将允许您减少对数据库的调用量,从而提高方法的整体性能。 Here就是一个让你入门的例子。