Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在数据库中更新邮件列表的最佳方法_Java_Sql_Database - Fatal编程技术网

Java 在数据库中更新邮件列表的最佳方法

Java 在数据库中更新邮件列表的最佳方法,java,sql,database,Java,Sql,Database,我有下面的数据库模式 SQL> describe USERS; Name Null? Type ----------------------------------------- -------- ---------------------------- user_id NOT NULL NUMBER(38) name

我有下面的数据库模式

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)
所以一个用户有很多电子邮件。 用户可以访问一个表单,在那里他们可以添加/删除他们的电子邮件。 问题是:哪种更新db的方式更好,因为db拥有从该表单获得的邮件列表

我在想:(java伪代码)

//数据库中的邮件列表。
ArrayList emailsInDB=getAllMailsFromDB(用户);
//表格中的邮件列表
ArrayList emailsInForm=form.getAllMail();
//迭代从表单获取的所有电子邮件。
用于(字符串电子邮件:EmailsForm){
if(emailsInDB.contains)(电子邮件){
//已经在数据库中
emailsInDB.remove(电子邮件,用户);
}否则{
//新邮件!添加到数据库中!
db.insertMail(电子邮件、用户);
}
//数据库中的所有电子邮件,但不在表单中,
//已删除。请从数据库中删除它们。
用于(字符串电子邮件:emailsInDB){
db.deleteMail(电子邮件);
}
欢迎提出更好的想法!
感谢阅读。

您可以做的一个优化是在插入新电子邮件之前先删除电子邮件

在伪SQL中:

DELETE from emails WHERE emali.user_id=userid AND email NOT IN(...list of emails from the form...) 
这会在一次调用SQL server时删除所有需要删除的电子邮件,如果您有很多电子邮件,而服务器离您很远,则会节省一些延迟

然后继续插入电子邮件

//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);
}
//数据库中的邮件列表。
ArrayList emailsInDB=getAllMailsFromDB(用户);
//迭代从表单获取的所有电子邮件。
用于(字符串电子邮件:EmailsForm){
如果(!emailsInDB.contains)(电子邮件){
//新邮件!添加到数据库中!
db.insertMail(电子邮件、用户);
}

您可以做的一个优化是在插入新电子邮件之前先删除电子邮件

在伪SQL中:

DELETE from emails WHERE emali.user_id=userid AND email NOT IN(...list of emails from the form...) 
这会在一次调用SQL server时删除所有需要删除的电子邮件,如果您有很多电子邮件,而服务器离您很远,则会节省一些延迟

然后继续插入电子邮件

//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);
}
//数据库中的邮件列表。
ArrayList emailsInDB=getAllMailsFromDB(用户);
//迭代从表单获取的所有电子邮件。
用于(字符串电子邮件:EmailsForm){
如果(!emailsInDB.contains)(电子邮件){
//新邮件!添加到数据库中!
db.insertMail(电子邮件、用户);
}

尽管没有很好的文档记录,但Oracle允许您定义一种称为VARRAY的数组类型。通过这些类型,您可以将“emailsToAdd”和“emailsToDelete”批量传递到一个过程中。这将允许您减少对DB的调用量,提高该方法的整体性能。这是一个让您开始的示例ed.

尽管没有很好的文档记录,Oracle允许您定义一种称为VARRAY的数组类型。通过这些类型,您可以批量将“emailsToAdd”和“emailsToDelete”传递到一个过程中。这将允许您减少对DB的调用量,提高该方法的整体性能。这是一个让您能够rted.

我不希望使用这种工具。更改RDBM时很难迁移它们。谢谢。同意。也许重新标记sql而不是oracle是合适的。我不希望使用这种工具。更改RDBM时很难迁移它们。谢谢。同意。也许重新标记sql而不是oracle是合适的里亚特。