2

ソフト削除に関する賛否両論の記事をすべて読んで頭が回転している。しかし、これを達成するために私が知っている唯一の方法は次のとおりです。

外部キーとユーザー情報(履歴データ)を維持するユーザーが削除/非アクティブになった場合でも、コメント、添付ファイル、ストーリーテーブルに外部キーがあります。このコメントなどを書いたのは彼であることがまだ確認できるように。

他の情報:

非アクティブ化されたユーザーはログインできず、リストに含まれません。

ただし、ソフト削除を使用する場合、そのテーブルをクエリするたびにSQLステートメントのWHEREに列を追加するのはあまり適切ではありません。

何をすべきか?あなたたちがいくつかの入力を与えることができることを願っています。

注:私はmysqlとRORを使用しています

4

2 に答える 2

6

ユーザーを「ソフト削除」する場合は、すべてのSQLステートメントのWHERE句に列を追加しないでください。代わりに、アクティブユーザーのみを返す1つのビューを作成し、アクティブユーザーについて知る必要があるクエリはそのクエリを使用します。彼らはベーステーブルを使用しません。

こんな感じかもしれません。

create view users_active as
select * from users
where deleted = false;

これまでに行った開発の量によっては、usersテーブルの名前を変更し、代わりに新しいビューに「users」という名前を付けることができます。これらの線に沿った何か。。。

alter table users rename to users_all;

create view users as
select user_id, user_name from users_all   -- All columns except "deleted"
where deleted = false;

これで、テーブル「users」をヒットするために使用されたクエリは、代わりにビュー「users」をヒットします。論理データの独立性-これが、ビューとテーブルがリレーショナルモデルで同じ名前空間を共有する理由です。

于 2011-09-28T09:52:35.007 に答える
1

この世界で物事を達成する方法はたくさんあります。誰かが言ったことは常に真実だとは思わないでください:)

まず、コメントに関しては-はい、ソフト削除を使用してコメントを送信した人のユーザー名を取得するためにユーザーテーブルに参加している場合-はい、コメントを書いた人を取得する方がはるかに簡単です。また、削除されているかどうかを簡単に確認できるため、HTMLでレンダリングすることもできます。一方、ユーザー名をコメントテーブルに保存して、ユーザーテーブルへの参加を回避することもできます。ただし、usersテーブルからその情報を受け取っていないため、ユーザーが削除されたかどうかを知ることは困難です。

WHEREに句を追加しても、誰も殺されません。SQLは、必要なデータを取得できるように作成されました。コンピューターはユーザーのニーズに適合しますが、その逆ではありません。したがって、ソフト削除が必要だと思われる場合は、それを使用してください。唯一の「本当の」欠点は、データベースにレコードを保持することです。そのため、誰かがソフト削除でデータベースを膨らませると言うかもしれません。

于 2011-09-28T09:52:13.083 に答える