【问题标题】:SQL Is "Delete all records, then add them again" instantly bad practice?SQL是“删除所有记录,然后再次添加”立即不好的做法吗?
【发布时间】:2019-10-07 16:35:02
【问题描述】:

我有一个 mvvm WPF 应用程序。在我看来,我显示了基本上 3 个表的表示。表 A 是主要对象。表 B 和 A 具有 n-n 关系。我有一个连接表来连接两者

所以在实际的应用程序中,您可以选择/取消选择您的 B 对象,我设法正确表示模型中选择/选择的内容。

我的问题出现了,最初选择对象 B,然后取消选择,然后再次选择。我的模型 A 中有一个“新”B 对象,不再有“ID”来检查它是否是新创建的,或者数据库中的条目是否已经存在。

基本上,我必须在实现某种机制之间做出决定,该机制会跟踪所有可能的创建/更新/删除选择。或者只是删除所有记录->根据我的模型添加记录。

选项 #2 对我来说似乎更简单,但也不是超级干净。

我想知道它到底有多糟糕?这是少量数据,可能不会经常更新。

编辑说明:它不是代码,但它是我能想到的最好的解释方式。

所以我开始加载我的客户对象,它有一个客户组列表。在基础数据库中,我有一个表客户、一个表组和一个表 Customer_Groups 来加入它们。

最初我的客户/屏幕如下所示

[ ] 1
[x] 2   (ID: 67, Group: 2, Customer: 5)
[ ] 3
[ ] 4
[x] 5   (ID: 30, Group: 5, Customer: 5)

然后用户取消选择组 2。

[ ] 1
[ ] 2   
[ ] 3
[ ] 4
[x] 5   (ID: 30, Group: 5, Customer: 5)

然后他又添加了组2,但是由于上次没有选中,所以我在内存中的对象得到了一个新生成的关联组对象。

[ ] 1
[x] 2   (ID: NULL, Group: 2, Customer: 5)
[ ] 3
[ ] 4
[x] 5   (ID: 30, Group: 5, Customer: 5)

刚写出来,我就想到了一个办法。我编写了一个更智能的查询来检查 group X Customer Y 的条目是否已经存在,如果存在则更新,否则创建它...我太专注于 ID。

【问题讨论】:

  • 当您说“删除数据”时,您的意思是内存中的数据,对吗?还是您实际上是通过 SQL 删除/截断数据?当您可以处理内存中的所有内容时,我认为后者没有任何理由。您能否使用 ViewBag 保持“B”对象存在而不会丢失它,尤其是在您提到的数据不多的情况下。
  • 你能输入一个代码示例吗?很难理解为什么任何一个对象在提交到数据库后都没有 ID。

标签: c# sql wpf


【解决方案1】:

如果不经常更新,重新创建这些关联应该不是问题。

现在,如果它是一个不断删除/重新关联记录的查询/进程,那么是的,您可能希望避免这种情况。

避免意外删除/重新添加关联问题的最佳方法是使用保存按钮更新 View/ViewModel 代码,该按钮将在用户完成时提交更改,而不是在每次用户交互后直接进行 SQL 更新。

我不会尝试恢复已删除的关联记录。尽管如果您愿意,可以使用删除的标志列。但是会导致一堆不必要的行,以防您想通过清除标志来重新添加链接。

【讨论】:

    【解决方案2】:

    由于您已经在数据库中创建了用于链接的项目,因此我只需创建一个继承该 DBO 并具有 IsSelected 属性的新对象,我们可以将其绑定到复选框。当用户保存时,您可以遍历对象列表并查看是否选择了一个项目但没有 ID,然后将其添加到数据库中。如果一个项目没有被选中但有一个 ID,你可以将它从数据库中删除。 如果用户没有点击保存按钮,您还可以查看 check_changed 事件并更新该特定项目。

    【讨论】:

      猜你喜欢
      • 2015-09-29
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      相关资源
      最近更新 更多