2009-06-15 62 views
0

我有以下數據庫模式。在db中更新郵件列表的最佳方法

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

更好的想法,歡迎! 感謝您的閱讀。你可以讓

回答

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

我最終做了類似的事情。 謝謝。 – Macarse 2009-06-15 01:27:46

2

雖然無據可查,Oracle允許你定義一個類型的數組稱爲VARRAY。通過這些,你可以批量處理'emailsToAdd'和'emailsToDelete'程序。這將允許您減少對數據庫的呼叫量,從而提高方法的整體性能。 Here是一個讓你入門的例子。

+0

我寧願不使用這種工具。在改變RDBM時,他們很難遷移。謝謝。 – Macarse 2009-06-15 00:52:06

相關問題