首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >删除每一行并在保存到数据库时重新添加。

删除每一行并在保存到数据库时重新添加。
EN

Software Engineering用户
提问于 2019-04-29 11:58:46
回答 4查看 337关注 0票数 7

我有一个结构看起来像

人物

代码语言:javascript
代码运行次数:0
运行
复制
ID        int
Name      nvarchar

电话

代码语言:javascript
代码运行次数:0
运行
复制
ID        int
PersonId  int
Number    nvarchar
Make      nvarchar
Model     nvarchar
MultiSim  bit

一个人可以有很多电话

目前,我的逻辑是当用户单击“保存”按钮时,应用程序接收Person对象的一个副本(其中包括一个数组电话)。

如前所述,这种关系是一对多的。因此,在保存时,只有一个人,所以很容易更新这个人(不需要删除和重新添加)。

目前,我删除了所有的手机相关的人,并重新添加他们。

我所看到的负面情况是:

  1. 额外的时间被占用,因为它必须删除,然后重新添加每一个电话,无论是否有修正案。
  2. 每当这个进程发生时,自动递增的电话ID就会越来越大。

我找不到任何东西来解释我目前的做法是否错误。我应该关心身份证越来越大了吗?我是否应该用我想要保存的对象来检查当前的手机对象呢?

EN

回答 4

Software Engineering用户

发布于 2019-04-29 13:01:01

我总是使用删除所有和重新添加的方法。

  1. 通常,只删除和重新添加比应用更新所需的逻辑更快。这可能需要选择、在运行检查时锁定等等。
  2. 我对所有内容都使用GUID,从而避免在插入问题上更改您的id。尽管必须指出,如果您有现有的id,则只需更改insert即可重用现有的id。
  3. 很简单。当你遇到瓶颈时,找出一种优化的方法。
  4. 当您执行大容量插入时,它会慢一些,因为它会强制循环。但是,通过使用一条语句删除所有子对象(其中personid在.中),很容易避免这种情况。然后阅读所有的东西
票数 6
EN

Software Engineering用户

发布于 2019-04-29 12:23:58

如果我对这种方法有问题的话,它将不是电话id的计数器,而是需要额外时间的事实。虽然有几个电话号码可能没什么大不了的(我无法想象在任何实际情况下有超过10个的人),但请记住,如果您必须保存所有的Person实例,那么现在它不再是一个循环而是一个嵌套的循环。

如果您决定要在与Person的一对多关系中删除和重新创建订单,那么在保存上将再次完成更多的工作。它的可伸缩性不是很强,因此您可能会有一天,您的客户端有10秒或更长的等待时间,否则就会直接保存到数据库中。

你问为什么这不应该是一个正确的方法,但我向你逆转了这个问题。为什么您不简单地跟踪哪些电话号码已经添加或删除,并相应更新?是否有特别的理由这样做,或根本的原因保持代码更简单?由于从长远来看,这最终可能是一个问题,我鼓励你考虑在必要时简单地添加和删除。

票数 2
EN

Software Engineering用户

发布于 2023-03-21 14:52:07

额外的时间被占用,因为它必须删除,然后重新添加每一个电话,无论是否有修正案。

在只需要一个更改的地方进行大量更改是效率低下且速度慢的。

在不需要任何东西的情况下做大量的改变是愚蠢的(对不起)。

数据库必须记录您所做的每一个更改,如果您要删除所有内容并将其全部重新添加,它基本上是做了两次这样的操作,没有任何理由,如果没有任何实际更改。与仅仅读取数据库相比,在数据库中编写任何东西都非常非常慢(更新总是涉及磁盘活动)。

此外,如果您的数据库正在进行任何类型的“数据审核”(其中的更改自动转移到“历史”表中),那么这种方法将生成大量的“箔条”,任何试图调查实际问题的人都必须“费力地”通过。(去过那里,做了那件事;而不是“有趣”)。

理想情况下,您不应该更改任何记录的主键(ID)。

在创建记录时应该分配它,并且应该保持不变,直到记录最终被销毁。想象一下,如果你的银行“重新编号”每个人的支票帐户,而其他人关闭他们的混乱!

如果有任何其他表引用您的人物_电话表,并且您正在正确地使用外键,那么您就根本无法删除它们!

正确执行此工作;更新用户更改的任何行,插入它们添加的任何行,并删除它们删除的任何行。

当此过程发生时,自动递增的电话ID会越来越大.我应该关心身份证越来越大了吗?

可能不会。

这取决于它有多大。一个int列的值将高达20亿(2^31-1)。如果你超过这一点,事情就会变得有点“混乱”。

在这种情况下,您可能还好,但是如果要将相同的逻辑应用到其他地方,这可能是一个完全不同的故事。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/391117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档