删除的最佳关系数据库方法:使用删除还是使用 valid/non-valid 列?
BEST RELATIONAL DATABASES APPROACH FOR DELETE: use DELETE or use a valid/non-valid COLUMN?
当谈到 数据库 时,这是 用户想要删除时使用的最佳 技术方法 他的 profile/delete 他的购物卡中的一些产品:
实际上从具有他的 id 的关系表中删除行,使用 DELETE。
不要删除任何行,但更改布尔值的值COLUMN/enum COLUMN(我们称之为 valid/non-valid)从 true 到 false/0 再到 1 - 这意味着无论何时你不想select all existing users/products 你需要一个 WHERE 子句来过滤仅在该特定列上为真。
我问这个是因为我和两位经验丰富的数据库开发人员谈过,当我告诉他们我真的要从我的 MySQL 数据库中的表中删除行时,他们感到震惊!其中一位告诉我,她被教导永远不要从表中删除已经插入的行。
所以我想找出最适合这个动作的专业方法。
也许他们没有回答技术问题,而是业务问题。如果您需要恢复发生在 profile/shoppingcart/whatever.
上的历史记录,那么删除一行是不好的(商业上的)
从技术的角度来看,这两种方式都没有强有力的论据。
将行标记为 "deleted" 会在 table 中留下混乱,并在 WHERE 子句中使用 AND deleted=0
使 SELECT 变得混乱。如果 table 的 'most' 被删除,性能会受到影响。
实际上,删除该行会丢失历史记录(如前所述),需要付出努力,并使 table 碎片化。努力很小。碎片,特别是如果您使用 InnoDB(您应该使用),则不值得担心。
第三种选择是将其从主 table 中删除,然后将其插入到具有 similar 架构的存档 table 中。这是更多的工作:在删除时使用 DELETE + INSERT,在需要同时查看活动行和已删除行时使用 UNION,等等。可以使用 PARTITION,但我认为它没有帮助。我说 similar 是因为您可能想避免可能会绊倒您的 UNIQUE 键(和其他东西),例如,如果他的购物车中的使用摇摆不定以至于同一行是存档两次。
这样看...银行记录非常永久;购物车非常短暂(直到购买完成);其他事情介于两者之间。根据业务原因选择实际删除与标记,超过 MySQL 个原因。
(我很想听听开发人员对我的评论的反应。我可能遗漏了一些东西。)
当谈到 数据库 时,这是 用户想要删除时使用的最佳 技术方法 他的 profile/delete 他的购物卡中的一些产品:
实际上从具有他的 id 的关系表中删除行,使用 DELETE。
不要删除任何行,但更改布尔值的值COLUMN/enum COLUMN(我们称之为 valid/non-valid)从 true 到 false/0 再到 1 - 这意味着无论何时你不想select all existing users/products 你需要一个 WHERE 子句来过滤仅在该特定列上为真。
我问这个是因为我和两位经验丰富的数据库开发人员谈过,当我告诉他们我真的要从我的 MySQL 数据库中的表中删除行时,他们感到震惊!其中一位告诉我,她被教导永远不要从表中删除已经插入的行。
所以我想找出最适合这个动作的专业方法。
也许他们没有回答技术问题,而是业务问题。如果您需要恢复发生在 profile/shoppingcart/whatever.
上的历史记录,那么删除一行是不好的(商业上的)从技术的角度来看,这两种方式都没有强有力的论据。
将行标记为 "deleted" 会在 table 中留下混乱,并在 WHERE 子句中使用 AND deleted=0
使 SELECT 变得混乱。如果 table 的 'most' 被删除,性能会受到影响。
实际上,删除该行会丢失历史记录(如前所述),需要付出努力,并使 table 碎片化。努力很小。碎片,特别是如果您使用 InnoDB(您应该使用),则不值得担心。
第三种选择是将其从主 table 中删除,然后将其插入到具有 similar 架构的存档 table 中。这是更多的工作:在删除时使用 DELETE + INSERT,在需要同时查看活动行和已删除行时使用 UNION,等等。可以使用 PARTITION,但我认为它没有帮助。我说 similar 是因为您可能想避免可能会绊倒您的 UNIQUE 键(和其他东西),例如,如果他的购物车中的使用摇摆不定以至于同一行是存档两次。
这样看...银行记录非常永久;购物车非常短暂(直到购买完成);其他事情介于两者之间。根据业务原因选择实际删除与标记,超过 MySQL 个原因。
(我很想听听开发人员对我的评论的反应。我可能遗漏了一些东西。)