質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2307閲覧

過去に編集したデータを復元や参照する方法

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2020/01/17 05:52

編集2020/01/17 05:58

タグでもある様にあDBはMySQLを使用してます。

1つ質問点がありますので、質問させていただきます。

前提・実現したいこと

PHPで削除する機能。例えば掲示板での削除機能ではデータベースでのデータを直接削除せずに論理削除機能(削除フラグをたてる)を使う事ができるとおもうのですが、投稿の編集をした際には元の投稿内容に上書きされてしまいます。
よって、復元したり参照はできません。
実際にはデータを上書きして保存せず、上書きされたというフラグを立て、ユーザーには上書きされたように見せ、かつ過去の編集履歴もすべて閲覧できる様にしたいです。

また、皆さんはどの様な方法で過去の編集履歴等を復元・参照しているのでしょうか?

#実装内容
teratailでも、質問・回答の過去の編集履歴が全て閲覧可能ですが、その様な機能を実装したいです。

試した事

どの様な処理の流れになっているのかも疑問点なのですが、自分で一度流れを書き出してみました。

・編集フォームを押すとその投稿の編集フラグが立つ。
・編集フラグが立っていればその投稿を上書きして保存する。
・編集フラグが立っていればその元の投稿を表示しない。

編集後のデータを別のカラムに格納するとして仮にユーザが5回編集したとするならその元の投稿と5回分のカラムが必要になってしまうので、その方法ではやはりないのでしょうか・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

少なくとも、今自分が開発しているサービスでは以下のER図のようにしてますね。
(黒塗り多めですみません。

イメージ説明

(一応公開しても大丈夫なER図です。

わかりにくかったので実際のデータっぽく書いてみました。(大雑把です。イメージです。
イメージ説明

投稿2020/01/17 06:09

編集2020/01/17 06:29
kyoya0819

総合スコア10429

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/17 06:14

ご回答ありがとうございます。 提示してもらったER図により、イメージがつきやすかったです。 あくまで、原本のデータは親エンティティであって、編集履歴は子エンティティである関係性といった認識でよろしかったでしょうか?
kyoya0819

2020/01/17 06:17

いえ、親自体は何も(本文やタイトルなど)データを持ちません。 すべて子が持っています。 簡単に言うと、編集による「上書き」や「更新」と言う概念が一切ない構造です。
退会済みユーザー

退会済みユーザー

2020/01/17 06:20

>簡単に言うと、編集による「上書き」や「更新」と言う概念が一切ない構造です。 参照先が、違うといった事だという事でしょうか?
kyoya0819

2020/01/17 06:29

簡単に画像を作ってみました。
kyoya0819

2020/01/17 06:34

(自分の用件ではこのDB構造が楽なのでこうしています。)
退会済みユーザー

退会済みユーザー

2020/01/17 06:39

とてもわかり易いご回答ありがとうございます。 誤解していた様ですが、誤解が解けた様です。 私の場合、画像でいう左には、元となる投稿データが格納されていたのですが、その様な方法もあるのですね。勉強になりました。 しかし、提示してもらったテーブル構造の場合どの様に参照するのでしょうか? 投稿IDとはまた別でIDをふる必要がある様に見えるのですが。
kyoya0819

2020/01/17 12:18 編集

今回は略していますが、1番右のテーブルにもIDは振ってあります。 参照時は右側のテーブルのID(PK, AI)で降順にし、最初に投稿IDと一致したものを取得するようにしています。
退会済みユーザー

退会済みユーザー

2020/01/17 06:50

なるほど。 分かりやすくご回答していただき、ありがとうございます。
kyoya0819

2020/01/18 14:30

ちなみに、補足ですがその後開発が進むにつれて、さらなるスピード向上のためにこの手法ではない手法をとるようになりました。
guest

0

ベストアンサー

ほぼ同じ構造で履歴番号を持たせたテーブルを用意しておき、対象テーブルに変更(CRUDのR以外)があったときに現在の情報を履歴情報として移動する

or

テーブルに履歴番号カラムを追加。
対象テーブルに変更(CRUDのR以外)があったときに最新の情報を現在の履歴番号+1で保存し、通常見られるのは履歴番号のMAXだけにする

お好きな方で。

投稿2020/01/17 05:57

編集2020/01/17 05:58
m.ts10806

総合スコア80852

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/17 06:03

>現在の情報を履歴情報として移動する ここの操作をSQL文ではどのように指定すれば良いのでしょうか?
m.ts10806

2020/01/17 06:06

SQL一発でも不可能ではないですが無理にしようとしなくても、要は「変更しようとしているレコード+履歴番号で別テーブルにデータを追加する」ができればいいので、かんがえられるやり方でやってください。 HOWにばかり注視していては本質を見失います。 WHAT,WHYを大事に
退会済みユーザー

退会済みユーザー

2020/01/17 06:06

すいません。 質問が適切ではなかった様です。 正しくは、変更があった際という時の操作はどの様に指定すればよかったのでしょうか?
退会済みユーザー

退会済みユーザー

2020/01/17 06:08

コメントが重複してしまい、(15:06の記事を)確認する前にコメントを投稿してしまいました。 一度、「変更しようとしているレコード+履歴番号で別テーブルにデータを追加する」の部分を構築していきます。
Orlofsky

2020/01/17 06:16

マスターテーブルと履歴テーブルをいっしょに設計するのが主義って人にぶち当たったことがあります。履歴を見るには便利ですが、通常のSQLはいちいちインラインビューでMAXで引っ張ってきて、、、とっても複雑なSQLになるし、パフォーマンスが悪くなったかと。 まともに動かないシステムで給料をもらうのを良しとしないわたしはさっさと降りました。
退会済みユーザー

退会済みユーザー

2020/01/17 06:25

Orlofskyさん インラインビューでMAXで引っ張ってきて。という処理は複雑な様な気がします。 m.ts10806さんの提示してもらった、上の方法で実装してみます。 ただ、m.ts10806さんの提示してもらった履歴番号のMAXだけにするというのは、私が質問文で過去全ての履歴を見る事ができる機能と記述したので、おそらく履歴を見るのに便利な為その様に回答してくださったのだと思います。
yambejp

2020/01/17 06:26 編集

maxを取るのではなく、表示用フラグ(カラム)をたてたほうが楽ですね 最終投稿時に同じ文書idの既存の表示フラグを消して、 自分自身にフラグをたてる 表示するのはフラグが立っているものだけにすれば、 シンプルな構造になります
退会済みユーザー

退会済みユーザー

2020/01/17 06:42

様々な方法があるのですね。 yambejpさんの提示してもらった方法は別で表示用のカラムを作成するという方法なのですね。 その様な思考には至らなかったので、そちらも実装したいと思います。
Orlofsky

2020/01/17 08:31

論理削除フラグなり履歴テーブルなりの両方で履歴情報も含んだ複数のマスターをJOINできる、ある程度のデータを用意してSQLを書いて実行計画を確認したり、処理時間を実測すると良いです。
m.ts10806

2020/01/17 09:24

やはりデータの状態とかあまり考えないままHOWばかりに注力しようとして混乱しているように見受けられます。 まず手書きでもExcelでもいいので書き出してみては?そうやって整理することで管理しやすい方法も考えられると思います。 履歴管理はあとからの変更が難しいものなので「同じようにやりたい」だけで通せるかは要件次第です。
退会済みユーザー

退会済みユーザー

2020/01/18 03:19

一度Excelでやってみますね。
m.ts10806

2020/01/18 03:44

要件定義、設計ができれば良いので手段は問いません。
guest

0

文書idに対して投稿日時と文書内容を順次追加してけばよいでしょう

投稿2020/01/17 05:56

yambejp

総合スコア114883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問