0

我对如何最好地更新连接表有点困惑。

Presentaion
id PK

Asset
id PK

PresentationAsset
presentationid
assetid

因此,当更新 PresentationAsset 中的 Presentation 及其关联资产时,我是否首先搜索所有关系,删除这些关系然后创建新关系?

处理这种情况的最佳方法是什么?

4

2 回答 2

1

至少,将它们全部删除并创建新的肯定是最简单的。毕竟,这只是两个查询。

DELETE FROM PresentationAsset WHERE presentationid = 1
INSERT INTO PresentationAsset VALUES (1, 1), (1, 2), (1, 3)

假设这些确实是该表中仅有的两列(例如,没有时间戳或其他任何内容),我无法想象您需要将其复杂化的任何原因。

毕竟,擦除现有行并插入所有新行的替代方法是保留已经存在的行,但删除不再存在的行,然后插入新行。本质上,您仍然至少会得到 oneDELETE和 one INSERT,因此在大多数现实世界的应用程序中应该不会有太大的性能差异。第一种方法的性能甚至可能更好,因为它需要较少的值检查每个操作。

当然,如果您正在处理一个足够大的场景,其中如此微小的性能差异很重要,您可能希望对所有选项进行真正的测试并自己测量性能。

当然,如果这些不是表中仅有的两列,则需要正确保留要更新的行的其他列的值,因此删除所有列并插入新列将不是一个选项反正。

于 2012-04-08T05:55:08.400 回答
0

您有 2 个选项:

1)删除所有资产并按照您所说的创建新资产(def更易于编码且更易于调试。如果您在 PresentationAsset 中没有 PK,您可能遇到的唯一问题是多次删除可能会留下大量数据在 PresentationAsset PK 上。)

2)这样做(在伪代码中)

  • 从当前与演示文稿关联的资产中获取所有 id(旧值)。我将其称为 array1
  • 对于新值中的每个资产:
    • 如果它已经存在,用它的新值更新它并从 array1 中删除它的 id
    • 如果不是,请创建它
  • 删除所有 PresentationId = currentPresentationId AND AssetId IN array1 的 PresentationAsset

希望它足够清楚,并希望我正确理解了您的问题;)我认为我可以接受 1),但 2)可能更好。您更新需要更新的值并删除那些已删除的值。

于 2012-04-08T05:49:33.820 回答