【问题标题】:SQL master-detail tables - better UPDATE or DELETE+INSERT?SQL 主从表 - 更好的 UPDATE 或 DELETE+INSERT?
【发布时间】:2016-09-14 09:09:43
【问题描述】:

我们有一个基于带有主表和多个连接表的 SQL 服务器数据库的内部软件。我们存储的数据的性质很难描述,但假设我们有一个客户表和一些连接表:订单、发货、电话日志、投诉等。

我们需要将此软件与具有自己的数据库(具有完全相同的结构)的外部软件同步,并生成一个 XML 文件,其中包含有关我们“客户”的更新信息(每个客户一个文件)。更新可能在主表和/或 0 到 n 个连接表中。

要导入这些文件,一种选择是查询所有涉及的表并将它们与 XML 文件进行比较,可能会添加-更新-删除行。

这需要大量的编码。

另一种选择是完全删除给定客户的所有数据(至少从连接表中)并再次插入。

这不会那么有效。

请考虑主表有 13 个字段,大约有 6 个表有 3 到 15 个字段。

在这个应用程序中,我们主要使用 LINQ。

你会怎么做?

PS:我在 StackOverflow 上注意到有关此主题的一些答案,但几乎所有问题都关注(单行)单个表。

【问题讨论】:

    标签: sql sql-server linq


    【解决方案1】:

    对于我有很多连接和很多行的情况,我更喜欢更新和进行逻辑删除。示例我有数百万客户,碰巧我有几十个表,其中有数百万行,FK 指向客户 ID。尝试删除客户可能需要几分钟时间。

    对于您的特定情况,我可以在每个相关表中使用一个标志来告诉我:此行已同步,该行已按待导出状态插入,行待删除或行已导出到 xml过去但已更新。

    对于出口:

    它可以很容易地只查询待插入、更新或删除的行,而忽略行是最新的。

    对于进口:

    如果其他系统没有此功能,您可以使用一个小技巧。添加“外部 ID”列以快速搜索您的数据库并识别源自该外部源的行。 如果只有那个电话号码在那个大表中更新,即使使用这个技巧也会很痛苦。对于那些极端情况,您可以使用哈希计算列来快速识别两行是否不同并更新整个(至少是公共列)行。

    【讨论】:

    • 感谢 Jean 的回答。数据永远不会从我们的应用程序中导出。我们的应用程序主要是只读的,数据由 3rd 方应用程序定期更新(通过 xml)。当然,每个 xml 文件都包含有关单个客户的所有数据(我的数据库中已有的数据和我需要添加/编辑/删除的数据)。因此,每次有文件进入时,我都无法告诉我应该更新什么,除非我比较每一行。我不清楚如何使用标志来处理这一切。
    • 标志仅对导出有用(可惜其他系统无法告诉您正在更新、插入、删除什么)和逻辑删除。仅对于导入,您可以创建“外部 ID”,如果表很大,还可以使用哈希列来确定是否有一个更新。您甚至可以对 XML 文件进行哈希编码,以检查文件与以前的版本相比是否有任何更改
    【解决方案2】:

    一个想法(考虑到您在数据库服务器端执行此操作):

    • 根据客户 xml 构建表。它可以是临时表或内存表。
    • 创建 SELECT 查询以查找新的、更新的、已删除的数据。这些选择查询将连接数据库中的表和从客户 xml 构建的表。连接的输出将告诉您是否有新记录、更新记录、删除记录或混合记录。
    • 相应地运行插入、更新、删除。

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2011-05-16
      • 2013-10-25
      相关资源
      最近更新 更多