我们有一个基于SQL服务器数据库的内部软件,它有一个主表和多个连接表。我们存储的数据的性质很难描述,但假设我们有一个客户表,其中包含一些联合表:订单,发货,电话日志,投诉等。
我们需要将此软件与具有自己的DB(具有相同结构)的外部软件同步,并生成XML文件,其中包含有关“客户”的更新信息(每个客户一个文件)。更新可以在主表和/或0到 n 连接表中。
要导入这些文件,一个选项是查询所有涉及的表并将它们与XML文件进行比较,可能是添加 - 更新 - 删除行。
这需要大量编码。
另一种选择是完全删除给定客户的所有数据(至少从连接的表中删除)并再次插入。
这样效率不高。
请考虑主表有13个字段,大约有6个表,有3到15个字段。
在这个应用程序中,我们主要使用LINQ。
你会怎么做?
PS:我在StackOverflow上注意到这个问题的一些答案,但几乎所有关注(单行)单表。
答案 0 :(得分:0)
对于我有很多连接和很多行的情况,我更喜欢更新并进行逻辑删除。示例我有数以百万计的客户,并且我有几十个表,其中有数百万行,FK根据客户ID进行查询。尝试删除客户可能需要几分钟时间。
对于您的特定场景,我可以在每个相关表中使用一个标志来告诉我:这些行已经同步,行被挂起为待定导出,行正在等待删除或行被导出到xml中过去但更新了。
出口:
可以轻松查询待挂起,更新或删除的行,并忽略行是最新的。
对于进口:
如果其他系统没有这个设施,那么你可以做一个小技巧。添加"外部ID"用于快速搜索数据库并识别源自该外部源的行的列。 即使使用这个技巧也很难找到是否只在那个大表中更新了那个电话号码。对于那些极端情况,您可以使用哈希计算列来快速识别两行是否不同并更新整个(至少是公共列)行。
答案 1 :(得分:0)
一个想法(考虑到你在数据库服务器端这样做):