Лучший способ обновить в БД список писем - PullRequest
0 голосов
/ 15 июня 2009

У меня есть следующая схема БД.

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 ]

3 голосов
/ 15 июня 2009

Одна из оптимизаций, которую вы можете сделать, - это сначала удалить электронные письма, прежде чем вставлять новые электронные письма

в псевдо 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);
}
2 голосов
/ 15 июня 2009

Несмотря на то, что документация не очень хорошо документирована, Oracle позволяет вам определять тип массива, называемый VARRAY. с их помощью вы можете передать в процедуру как 'emailsToAdd', так и 'emailsToDelete' в пакете. Это позволит вам уменьшить количество обращений к БД, что повысит общую производительность метода. Здесь - пример, с которого можно начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...