2009-06-15 16 views
0

私は以下のdbスキーマを持っています。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) 

1人のユーザーに多数のメールがあります。 ユーザーは、自分のメールを追加/削除できるフォームにアクセスできます。 問題は次のとおりです。このフォームから取得したメールのリストを持つdbを更新するには、どちらが良い方法ですか?

私はのようなものを考えていた

:(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

最適化の1つは、最初の擬似SQLで新しい電子メール

を挿入する前に電子メールを削除することです:SQLサーバーへの1回の呼び出しで削除する必要があるすべての電子メールを削除し

DELETE from emails WHERE emali.user_id=userid AND email NOT IN(...list of emails from the form...) 

電子メールがたくさんあり、サーバーが遠く離れていると、待ち時間が短縮されます。あなたはVARRAYという配列の型を定義するため

その後、十分に文書化されてはいないが、メールに

//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

2

を挿入するに進み、Oracleができます。これらを使用すると、 'emailsToAdd'と 'emailsToDelete'の両方を一括してプロシージャに渡すことができます。これにより、DBへのコール量を減らすことができ、メソッドの全体的なパフォーマンスが向上します。 Hereは、あなたを始めるための例です。

+0

私はこの種のツールを使用しないことをお勧めします。 RDBMの変更時に移行するのは困難です。ありがとう。 – Macarse

+0

が合意しました。おそらくoracleとは対照的にSQLのretagが適切です。 – akf

+0

真。ただそれをしました。 – Macarse

関連する問題