【发布时间】:2013-09-04 21:27:08
【问题描述】:
数据库引擎应该完成所有工作,还是应该由客户端应用程序负责检查唯一性?
我正在用 C# 开发一个应用程序来扫描驱动器并将文件信息存储在 SQL Server CE 数据库中,我想知道哪种方法可以确保唯一条目是“最佳”的。到目前为止,我尝试了以下三种方法,并没有发现任何性能差异:
- 维护一个集合对象
- 检查数据库中是否存在
- 依赖于数据库中的唯一索引
我的三种方法的伪代码。实际代码将文件分解为多个部分,并使用多个表来存储路径、扩展名、卷/服务器和其他信息,以及索引记录以查找数据。
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 全部功能的 SQL Server CE,请在提供建议时牢记这一点。
【问题讨论】:
-
看起来每个人都一致同意在表上设置唯一约束是防止数据库中重复值的最佳方法。此外,在尝试插入/更新之前尝试过滤值甚至可能没有太多好处。 Gordon Linoff 很好深入的回答,但我选择 Gary Walker 是因为他的回答最实用。我想我现在的问题是如果我要在插入之前过滤值我应该使用方法 1 还是 2(更多的代码和内存使用与数据库开销)?
标签: c# .net sql tsql sql-server-ce