在db中更新邮件列表的最佳方法

时间:2009-06-15 00:12:52

标签: java sql database

我有以下数据库架构。

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);
}

欢迎更好的想法! 谢谢你的阅读。

2 个答案:

答案 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就是一个让你入门的例子。