繁体   English   中英

SQL Server CE应用程序中的独特记录插入最佳实践

[英]Unique Record Insertion Best Practice in SQL Server CE Application

数据库引擎应该完成所有工作,还是应该检查唯一性是客户端应用程序的责任?

我正在用C#开发一个应用程序,以扫描驱动器并将文件信息存储在SQL Server CE数据库中,我想知道确保唯一条目“最佳”的方法。 到目前为止,我尝试了以下三种方法,但尚未发现性能上的任何差异:

  1. 维护收集对象
  2. 检查数据库中是否存在
  3. 依靠数据库中的唯一索引

我的三种方法的伪代码。 实际的代码将文件分解成几个部分,并使用几个表来存储路径,扩展名,卷/服务器和其他信息,以及使用索引记录来查找数据。

collectionObj //initialize with existing records from database
While (filesToAdd.Count > 0 )
{
    file = filesToAdd.Dequeue();
    If(!collectionObj.Contains( file.Name ))
    {
        Insert file.Name into database
        collectionObj.Add(file.Name)
      }
}  

对于方法1,我认为在内存中搜索对象会更快,但是由于SQL Server CE数据库也在内存中,因此我不确定这样做的好处。

While (filesToAdd.Count > 0 )
{
    file = filesToAdd.Dequeue();

    if(  ( select count(*) from database where filename = file.Name) == 0 )  
    {
       Insert file.Name into database
    }
}

方法2不使用任何额外的对象/内存,而是查询数据库很多以查找重复项。 使用SQL Server CE,网络流量不是问题,但是过多的查询必须对性能产生影响。

While (filesToAdd.Count > 0 )
{
        file = filesToAdd.Dequeue();
        try
       {
          Insert file.Name into database
       }catch(Duplicate index violation exception)
       {
          //do nothing 
       }
}

我倾向于方法3,主要是因为它简化了代码,但似乎没有最佳实践。 同样,在重复插入时,数据库也会引发错误,程序也会引发错误。 这似乎会影响性能。

给定提供的信息,这是当您知道会有很多重复项时将大量信息添加到数据库中的“最佳”方法吗? 如果数据主要是唯一的或主要是重复的,答案是否会改变? 如果您有更好的方法,那么我所想到的我将很高兴听到。 我的问题专门是关于SQL Server CE,它没有SQL Server的全部功能,请在提供建议时记住这一点。

答案是 。 在数据库中执行此操作。

唯一性要求是数据的要求。 该数据库应用于强制执行这些要求。

请记住,确保唯一条目需要对insertupdate都进行测试。 而且,您希望将唯一性作为数据完整性的一部分。 因此,无论更新或插入的完成方式如何(通过应用程序,手动,通过触发器或其他方式),您都希望进行检查。 确保始终完成的唯一方法是在数据库中进行检查。

这个论点超越了性能。 但是,假定唯一索引适合内存,数据库应该通过性能检查非常有效。 在某些情况下,性能是如此重要,以至于在应用程序中将检查约束。 这些将是很少的。 而且,我可能会质疑为什么将数据库用于此类应用程序的数据存储。

懒惰的好方法为什么会成为坏的方法?

如果要使用数据库存储数据,并且要确保没有重复的条目,那么当然应该在对行使用UNIQUE约束之前。 它不仅有助于您维护无重复的数据存储,而且还为您提供了识别每一行的好方法。

如果存在重复的条目,则数据库引擎在插入数据库时​​会注意到这一点,并引发您容易捕获的错误/异常。

正确答案与往常一样,取决于情况。 拥有数据库的“懒惰”解决方案最终是正确的答案。 但是,如果您可以在客户端上过滤掉重复项,并且过滤出来的时间和精力足以避免数据库执行所有过滤,那么在客户端上进行过滤就很有意义。 您仍将在数据库上实施唯一性,但是您可以通过过滤掉客户端上的某些或大多数重复项来减轻数据库的某些处理负担。 如果我从实际的应用程序经验中知道那是值得的,那我可能只会走这条路。

显然,您希望数据库处理唯一的约束,但这听起来像是要避免在尝试插入重复记录时引发的异常。 通常,我建议您在SQL INSERT语句中使用IF NOT EXISTS,但是您不能使用SQL Server Compact来做到这一点。

另一个技巧可能是先尝试执行UPDATE,如果没有受影响的行,则说明该记录不存在,可以安全地插入它。 这需要一些额外的工作,但是如果您期望有很多重复项,那么它可能比捕获所有这些异常更为有效。

在甚至将已知重复项放入数据库之前,尝试过滤掉已知重复项也是明智的。 也许考虑使用HashSet来跟踪在该会话期间已经插入的唯一ID。 如果值在您的HashSet中,则您可以跳过它并保存对数据库的调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM