Mysqlは多種の論理削除方案を実現する
3149 ワード
Mysqlは多種の論理削除方案を実現する新規論理削除フィールド方式 マルチdeleted値 deleted:0は削除されていないことを表し、削除時にdeletedをタイムスタンプUNIX_に割り当てます.TIMESTAMP(NOW()) バックアップテーブル方式 を採用
最近会社のプロジェクトをする时、表のロジックの削除に対して、他の同僚と异なる意见が现れたので、いくつかのblogを调べて、自分の実际の情况を结び付けて、再び笔记をして、后で调べるためです.実際のプロジェクト開発では、いくつかのビジネスデータに対して、一般的に物理的に削除する方法は採用されません.結局、データは貴重なので、論理的に削除する方法もあります.一般的な論理削除方法は以下の通りである:1.関連するテーブル構造の論理削除フィールド
新規論理削除フィールド方式
フィールドにdeleted:0を設定すると、削除されていません.1は削除されています.以下の説明は、Artifact表で説明します.この表の
id
project_id
name
create_user
deleted
1
project001
artifact_01
xiaoma
0
2
project002
atifact_02
xiaoma
1
4
project003
phone
xiaoma
0
マルチdeleted値0:削除として、その他の値は削除を表し、以下の表: id
project_id
name
create_user
deleted
1
project003
phone
xiaoma
0
2
project003
phone
xiaoma
1
4
project003
phone
xiaoma
2
この方式はUnique Keyを維持することができますが、deletedの衝突が多いので、deletedの累積を保証する必要があります.それはもっと方法がありますか.次は上の改良版です.
deleted:0は削除されていないことを表し、削除時にdeletedをタイムスタンプUNIX_に割り当てます.TIMESTAMP(NOW())
実はゼロ以外の値を削除はいのタイムスタンプに変更することです.このようなメリットは、現在の削除データの時間を記録できることです.また、特定の時点でのレコードの検索と遡及にも便利です.
id
project_id
name
create_user
deleted
1
project003
phone
xiaoma
0
2
project003
phone
xiaoma
1573631978
4
project003
phone
xiaoma
1573631943
バックアップ・テーブル方式の採用
削除するたびにバックアップテーブルにデータを書き込み、元のレコードをJSON形式で完全に保存してから削除するのが実現原理です.やはり
id
project_id
name
create_user
1
project001
artifact_01
xiaoma
2
project002
atifact_02
xiaoma
4
project003
phone
xiaoma
id
project_id
name
create_user
deleted
2
project002
atifact_02
xiaoma
2019-11-14 15:14:45
削除後の
id
project_id
name
create_user
1
project001
artifact_01
xiaoma
4
project003
phone
xiaoma
利点:元のテーブルには削除されたデータが含まれていないため、クエリーの効率が低下します.欠点:実現が面倒で、論理的に削除する必要があるテーブルごとにバックアップテーブルが必要です.
https://cloud.tencent.com/developer/article/1531915
最近会社のプロジェクトをする时、表のロジックの削除に対して、他の同僚と异なる意见が现れたので、いくつかのblogを调べて、自分の実际の情况を结び付けて、再び笔记をして、后で调べるためです.実際のプロジェクト開発では、いくつかのビジネスデータに対して、一般的に物理的に削除する方法は採用されません.結局、データは貴重なので、論理的に削除する方法もあります.一般的な論理削除方法は以下の通りである:1.関連するテーブル構造の論理削除フィールド
deleted
0が追加され、削除されていないことを示し、1が削除されたことを示す(現在最も一般的な方法;2.バックアップ・テーブルを使用して、削除するデータをバックアップ・テーブルに書き込み、プライマリ・テーブルのデータを削除する.以下、2つの異なる方法の使用例について、その利点を分析する.新規論理削除フィールド方式
フィールドにdeleted:0を設定すると、削除されていません.1は削除されています.以下の説明は、Artifact表で説明します.この表の
project_id
およびname
はartifact表のUnique Key
およびUK(project_id
,name
)です.次の図に示すように、artifact_02
は削除されたが、テーブル構造が連合インデックスを設計しているため、このレコードも追加できなくなるため、この場合は削除を満たすしかないが、同じデータの再追加は実現できない.だから論理削除のニーズに合わないシーンもありますが、改善点はありますか?答えはもちろんあります.id
project_id
name
create_user
deleted
1
project001
artifact_01
xiaoma
0
2
project002
atifact_02
xiaoma
1
4
project003
phone
xiaoma
0
マルチdeleted値
project_id
name
create_user
deleted
1
project003
phone
xiaoma
0
2
project003
phone
xiaoma
1
4
project003
phone
xiaoma
2
この方式はUnique Keyを維持することができますが、deletedの衝突が多いので、deletedの累積を保証する必要があります.それはもっと方法がありますか.次は上の改良版です.
deleted:0は削除されていないことを表し、削除時にdeletedをタイムスタンプUNIX_に割り当てます.TIMESTAMP(NOW())
実はゼロ以外の値を削除はいのタイムスタンプに変更することです.このようなメリットは、現在の削除データの時間を記録できることです.また、特定の時点でのレコードの検索と遡及にも便利です.
id
project_id
name
create_user
deleted
1
project003
phone
xiaoma
0
2
project003
phone
xiaoma
1573631978
4
project003
phone
xiaoma
1573631943
バックアップ・テーブル方式の採用
削除するたびにバックアップテーブルにデータを書き込み、元のレコードをJSON形式で完全に保存してから削除するのが実現原理です.やはり
artifact
表を例に挙げます.ここで論理削除を実現するには、削除するデータを格納するためにartifact_bankend
表を新規作成します.artifact
表のデータは以下の表のように、id
が2の記録を削除したいのですが、私がしなければならないことは、まずartifact
表のidが2のこの表のデータcopyをartifact_bankend
表に、artifact
表のデータを削除することです.id
project_id
name
create_user
1
project001
artifact_01
xiaoma
2
project002
atifact_02
xiaoma
4
project003
phone
xiaoma
artifact_bankend
表:artifact
表のデータをartifact_bankend
表に書き込む.削除時間を格納するdeletedフィールドが追加されました.id
project_id
name
create_user
deleted
2
project002
atifact_02
xiaoma
2019-11-14 15:14:45
削除後の
artifact
表のデータは次のとおりです.id
project_id
name
create_user
1
project001
artifact_01
xiaoma
4
project003
phone
xiaoma
利点:元のテーブルには削除されたデータが含まれていないため、クエリーの効率が低下します.欠点:実現が面倒で、論理的に削除する必要があるテーブルごとにバックアップテーブルが必要です.
https://cloud.tencent.com/developer/article/1531915