5

この質問は、PHP で記述された私の Pastebin アプリに関するものです。

少し調べてみましたが、自分のニーズに合った解決策を見つけることができませんでした。この構造のテーブルがあります:

+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(12) unsigned | NO   | PRI | NULL    | auto_increment |
| author    | varchar(50)      | YES  |     |         |                |
| authorid  | int(12) unsigned | YES  |     | NULL    |                |
| project   | varchar(50)      | YES  |     |         |                |
| timestamp | int(11) unsigned | NO   |     | NULL    |                |
| expire    | int(11) unsigned | NO   |     | NULL    |                |
| title     | varchar(25)      | YES  |     |         |                |
| data      | longtext         | NO   |     | NULL    |                |
| language  | varchar(50)      | NO   |     | php     |                |
| password  | varchar(60)      | NO   |     | NULL    |                |
| salt      | varchar(5)       | NO   |     | NULL    |                |
| private   | tinyint(1)       | NO   |     | 0       |                |
| hash      | varchar(12)      | NO   |     | NULL    |                |
| ip        | varchar(50)      | NO   |     | NULL    |                |
| urlkey    | varchar(8)       | YES  | MUL |         |                |
| hits      | int(11)          | NO   |     | 0       |                |
+-----------+------------------+------+-----+---------+----------------+

これは、ペーストビン アプリケーション用です。私は基本的にリビジョンを貼り付けたいので、ペースト #1234 を開くと、そのペーストの過去のリビジョンがすべて表示されます。

次の3つの方法を考えました。

方法 1

id と old_id などを含むリビジョン テーブルがあり、各 ID に対してすべての古いリビジョンを挿入するので、私の構造が次のようになっている場合:

rev3: 1234
rev2: 1233
rev1: 1232

テーブルには次のデータが含まれます。

+-------+----------+
| id    | old_id   |
+-------+----------+
| 1234  | 1233     |
| 1234  | 1232     |
| 1233  | 1232     |
+-------+----------+

これで私が抱えている問題は、多くの重複データが導入されることです。そして、リビジョンが増えれば増えるほど、データが増えるだけでなく、リビジョン テーブルに新しい貼り付けを行うたびに N 個の挿入を行う必要があり、大きな N には適していません。

方法 2

一番上の貼り付けテーブルに child_id を追加して、それを更新するだけです。そして、ペーストをフェッチするときに、各 child_id とその child_id などについてデータベースにクエリを実行し続けます...しかし、問題は、多くのリビジョンを持つペーストが開かれるたびに、あまりにも多くの DB 読み取りが発生することです。

方法 3

別のリビジョン テーブルも必要ですが、方法 1 と同じシナリオでは、次のようにデータを格納します。

+-------+-----------------+
| id    | old_id          |
+-------+-----------------+
| 1234  | 1233,1232       |
| 1233  | 1232            |
+-------+-----------------+

そして、だれかがペースト 1234 を開いたときに、IN 句を使用して、そこにあるすべての子ペースト データを取得します。

最適なアプローチはどれですか? または、より良いアプローチがありますか?Eloquent ORM を備えた Laravel 4 フレームワークを使用しています。

編集:oneToMany関係で方法1を実行できますか? Eager Loadingを使用してすべてのリビジョンをフェッチできることは理解していますが、ダーティー ハックを行わずにそれらを挿入するにはどうすればよいでしょうか?

編集:上記の処理方法を理解しました。この質問を閉じるために回答を追加します。

4

3 に答える 3

8

Laravel 4 を使用している場合は、Revisionableを試してみてください。これはあなたのニーズに合うかもしれません

于 2013-08-29T05:48:11.287 に答える
2

だからここに私がやっていることがあります:

これがリビジョン フローであるとします。

1232 -> 1233 -> 1234
1232 -> 1235

したがって、リビジョンテーブルは次のようになります。

+----+--------+--------+
| id | new_id | old_id |
+----+--------+--------+
| 1  | 1233   | 1232   |
| 2  | 1234   | 1233   |
| 3  | 1234   | 1232   |
| 4  | 1235   | 1232   |
+----+--------+--------+

ID 2 と 3 は、1234 を開くと、1233 と 1232 の両方がリストのリビジョンとして表示されることを示しています。

次に、実装について説明します。Paste モデルを Revision モデルと 1 対多の関係にします。

  • 既存のペーストの新しいリビジョンを作成するとき、バッチ挿入を実行して、現在の new_id と old_id のペアを追加するだけでなく、現在の new_id を old_id に関連付けられたすべてのリビジョンとペアにします。
  • 貼り付けを開くと (new_id を照会して行う)、基本的にリビジョン テーブル内の関連するすべての行が取得され (hasMany('Revision', 'new_id') を定義する Paste モデルの関数を使用)、表示されます。ユーザー。

また、「ビューペースト」ページの「改訂履歴」に各改訂の作成者を表示することも考えているので、改訂表にも作成者欄を追加して行かなくてもいいようにしようと思います。メインの貼り付けテーブルに戻ってクエリを実行し、作成者を取得します。

それはそれについてです!

于 2013-08-30T04:06:30.983 に答える
1

モデルのリビジョンを維持するのに役立つ優れたパッケージがいくつかあります。

  • モデルのリビジョンのみを保持したい場合は、次を使用できます。

改訂可能

  • カスタムデータを使用して、いつでも他のアクションをログに記録したい場合は、次を使用できます。

Laravelアクティビティロガー

佳作:

于 2016-09-22T17:42:07.680 に答える