C#和SQLServer规范化大量的Url

时间:2014-08-11 11:16:23

标签: c# sql-server normalization

我在数据库中有很多表,其中至少有一个包含Url的列。这些在数据库中重复了很多次。所以我将它们规范化为专用表,我只需要在需要它的地方使用数字ID。我经常需要加入它们,因此数字ID比完整字符串要好得多。

MySql + C++中,要在一次攻击中插入大量网址,我过去常常使用多行INSERT IGNOREsmysql_set_local_infile_handler()。然后使用SELECT批处理IN ()以从数据库中取回ID。

C# + SQLServer中,我注意到SqlBulkCopy课程在群众插入方面非常有用和快速。但我插入后也需要批量选择来解析Url ID。 是否有任何此类帮助程序类与SELECT WHERE IN (many, urls, here)的作用相同?

或者您是否有更好的想法在C#中以一致的方式将网址转换为数字?我在考虑crc32网址或crc64他们但我担心碰撞。我不在乎碰撞是否很少,但如果不是......那将是一个问题。

PS :我们正在谈论数以千万计的网址以了解规模。

PS :对于基本大型插入,SQLBulkCopySqlDbType.Structured快。此外,它还有SqlRowsCopied事件用于状态跟踪回调。

2 个答案:

答案 0 :(得分:2)

甚至比SQLBulkCopy更好的方法。

它被称为Structured Parameters,它允许您通过ADO.NET将表值参数传递给存储过程或查询。

文章中有代码示例,因此我只重点介绍了启动和运行所需的操作:

  1. 在数据库中创建用户定义的表类型。你可以称之为UrlTable
  2. 通过连接表变量或键入UrlTable
  3. 来设置执行SELECT的SP或查询
  4. 在您的支持代码(C#)中,创建一个与DataTable具有相同结构的UrlTable,用URL填充它并将其作为结构化参数传递给SqlCommand。请注意,列顺序对应关系在数据表和表类型之间是至关重要的。
  5. ADO.NET在幕后做了什么(如果你对查询进行了剖析,你可以看到这个)是在查询之前它声明了一个UrlTable类型的变量并用你传入的内容填充它(INSERT语句)结构化参数。

    除此之外,在查询方面,您可以使用SQL中的表值参数(连接,选择等)完成所有操作。

答案 1 :(得分:0)

我认为您可以在索引上使用IGNORE_DUP_KEY选项。如果在URL列的索引上设置IGNORE_DUP_KEY = ON,则只会忽略重复的值,并相应地插入其余值。