web-dev-qa-db-ja.com

管理者の承認後にのみ、リレーショナルデータベーステーブルにデータを挿入/更新します-どのようにアプローチしますか?

PHPを介してWebサイトアプリケーションに接続されている21のテーブルを保持するリレーショナルデータベースを構築しています。

Webサイトには、ユーザーがこのデータベースを検索できる検索機能があります。また、ユーザーは特別なフォームを使用して新しいデータを入力できます。これらのエントリは管理者による厳密な制御を通過する必要があるため、管理者のみが利用できる何らかの承認システムを作成し、検索結果に表示される前にユーザー入力を確認し、それを許可してユーザーに返すことを許可します。変更、または削除します。

私の質問は、リレーショナルデータベースの設計の観点から、この状況に対するアプローチはどのようなものであり、ベストプラクティスは何ですか

追伸質問の幅は広いと思いますが、このウェブサイトのインターネットや他の投稿を検索しても答えは見つかりませんでした。

2
Boris J.

私は管理者と彼の承認のために特別にUIを作成します。承認待ちのものを表示します。一人ずつ「承認」「拒否」(等)をクリックしていきます。それは、おそらくAJAX経由で、処理のためにバックエンドに送られます。

データベースには2セットのテーブルがあります。テーブルの数や列が必ずしも同じであるとは限りません。

1つのセットは、完全に承認されたデータであり、システムへのアクセスを許可されたユーザーが(一部のUIを介して)表示できます。

もう1つのセットは、管理者のみを対象としています。

  • 保留中のものは、意味のあるETLメカニズムを介してこれらのテーブルに入れられます。
  • AJAX管理者からの呼び出しにより、行が発生します
  • 削除する(または拒否のフラグを立てる)、または
  • 他のテーブルセット(「承認済み」)にコピーして削除する、または
  • さらに熟考するためにそこに残される、または
  • なんでも。

おそらく管理者のテーブルの「行」が非正規化されている可能性があります。承認されたテーブルにコピーされると、正規化が行われます。つまり、管理者の承認前と承認後のどちらで正規化を行うのが便利かを決定する必要があります。

未承認の行が承認された領域の正規化テーブルを指すかどうかは、利便性の問題です。値を「正規化」してから、そのリンクを削除しても問題はありません。このmayは、参照されていない項目を正規化テーブルに残しますが、他の場所で便宜を図るために少額の場合もあります。 (いいえ、FOREIGN KEYsに関連付けられた「参照カウント」機能がないため、ON DELETE CASCADEは役に立たないと思います。)

0
Rick James

基本的に2つのオプションがあります。

  1. 各テーブルを「ステータス」列で拡張し、可能な値は「新規」、「承認済み」、および「拒否済み」にします。おそらく、管理者によるコメント用の別の列と、レコードの所有者(すでに存在している可能性があります)を識別するための列です。インポートモジュールを除くすべてのモジュールは、常にStatus = Approvedでフィルタリングする必要があります。これもインデックスに影響します。このアプローチはデータモデルへの影響を最小限に抑えますが、それがおそらく唯一の利点です。

  2. 個別に構築import_*各テーブルのテーブル。それらは1のテーブルと同じ構造になります。レコードが承認されると、そのレコードは逐語的に「実際の」テーブルにコピーされます。テーブルの作成と保守はより手間がかかりますが、データはより適切に分離され、コアアプリケーションのロジックを変更する必要はありません。

MySQLには、INSERTステートメント用の組み込みの待機キューはありません(または、問題のデータベースはありません)。あなたが説明することは通常、アプリケーションロジックで処理され、データベースはストレージのためだけに存在します。

2
Glorfindel