【问题标题】:C# and SQLServer normalizing large sets of UrlsC# 和 SQLServer 规范化大量 Url
【发布时间】:2014-10-04 04:53:54
【问题描述】:

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

MySql + C++中,为了一次插入很多Url,我曾经使用多行INSERT IGNOREsmysql_set_local_infile_handler()。然后将 SELECTIN () 批处理以从数据库中提取 ID。

C# + SQLServer 中,我注意到有一个SqlBulkCopy 类在批量插入中非常有用且快速。但是我还需要在插入 URL ID 后进行批量选择来解析它们。 有没有这样的帮助类可以和SELECT WHERE IN (many, urls, here) 一样工作?

或者你有更好的想法在 C# 中以一致的方式将 Urls 转换为数字?我考虑过 crc32'ing url 或 crc64'ing 它们,但我担心碰撞。我不在乎碰撞是否很少,但如果不是......这将是一个问题。

PS:我们正在讨论数千万个 Url 以了解规模。

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

【问题讨论】:

    标签: c# sql-server normalization


    【解决方案1】:

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

    【讨论】:

    • 我已经这样做了。这是解决 SQLServer 中缺少 INSERT IGNORE 的方法。
    【解决方案2】:

    还有比 SQLBulkCopy 更好的方法。

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

    文章中有代码示例,所以我只强调你需要做些什么来启动和工作:

    1. 在数据库中创建用户定义的表类型。你可以叫它UrlTable
    2. 设置一个 SP 或查询,通过与表变量连接或键入 UrlTable 来执行 SELECT
    3. 在您的支持代码 (C#) 中,创建一个与 UrlTable 具有相同结构的 DataTable,用 URL 填充它,并将其作为结构化参数传递给 SqlCommand。请注意,数据表和表类型之间的列顺序对应关系至关重要。

    ADO.NET 在幕后所做的(如果您分析查询,您可以看到这一点)是在查询之前,它声明了一个 UrlTable 类型的变量并使用您在结构化中传递的内容填充它(INSERT 语句)参数。

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

    【讨论】:

    • Mersi. Pare ca asta e solutia。 Acum am de studiu... :)
    • @CodeAngry: N-ai pentru ce :)
    • 已实现。 完美运行,速度极快! 2 周进入 C# 和 SQLServer ......我喜欢它。让我的生活更轻松。
    猜你喜欢
    • 2012-05-22
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2012-09-23
    • 2018-01-09
    相关资源
    最近更新 更多