2009-06-15 7 views
0

J'ai le schéma suivant db.La meilleure façon de mettre à jour dans un db une liste de mails

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) 

Donc, un utilisateur a beaucoup de courriels. Les utilisateurs peuvent accéder à un formulaire dans lequel ils peuvent ajouter/supprimer leur adresse e-mail. La question est: Quelle est la meilleure façon de mettre à jour le db ayant la liste des mails obtenus à partir de ce formulaire?

Je pensais quelque chose comme: (code java pseudo)

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

meilleures idées sont les bienvenues! Merci d'avoir lu.

Répondre

3

Une optimisation que vous pouvez faire est de supprimer des e-mails avant d'insérer de nouveaux e-mails

en pseudo SQL:

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

qui supprime tous les e-mails qui doivent être supprimés dans un appel au serveur SQL ce qui économise un peu de latence si vous avez beaucoup de mails et que le serveur est loin.

procéder ensuite avec des e-mails

insérer
//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

J'ai fini par faire quelque chose de similaire. merci. – Macarse

2

Bien que pas bien documenté, Oracle permet pour vous de définir un type de tableau appelé VARRAY. avec ceux-ci, vous pouvez passer dans une procédure à la fois les «emailsToAdd» et «emailsToDelete» dans un lot. Cela vous permettra de réduire le nombre d'appels que vous apportez à la base de données, améliorant ainsi les performances globales de la méthode. Here est un exemple pour vous aider à démarrer.

+0

Je préférerais ne pas utiliser ce genre d'outils. Ils sont difficiles à migrer lors de la modification de RDBM. Merci. – Macarse

+0

convenu. peut-être un retag de SQL par opposition à Oracle est approprié. – akf

+0

True. Je l'ai juste fait. – Macarse

Questions connexes