この質問は、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を使用してすべてのリビジョンをフェッチできることは理解していますが、ダーティー ハックを行わずにそれらを挿入するにはどうすればよいでしょうか?
編集:上記の処理方法を理解しました。この質問を閉じるために回答を追加します。