sql >> データベース >  >> RDS >> PostgreSQL

リレーショナルデータベースで大きな文字列フィールドの編集履歴を保持する方法

    私が現在取り組んでいるソリューションは、これまでうまく機能しており、質問で提案した設計を実装しています

    ここで実装の詳細を共有します

    デルタを作成し、を使用してフルテキストを再構築するために、私は素晴らしいgoogle-diff-match-patchライブラリ 。実装に依存しないAPIドキュメント を読むことができます。 とにかくかなり読みやすいですが、以下のコード例をよりよく理解するために。

    google-diff-match-patch JavaとJSの実装があるので、それを使用してサーバー上のJavaでデルタを計算できます。データベースに簡単に保存でき、クライアントのJSライブラリで簡単に使用できるように、各デルタを文字列に変換することを選択しました。詳細については、以下をご覧ください。

    public String getBackwardsDelta(String editedBlogPost, String existingBlogPost) {
        diff_match_patch dmp = new diff_match_patch();
        LinkedList<diff_match_patch.Patch> patches = 
            dmp.patch_make(editedBlogPost, existingBlogPost);
        return dmp.patch_toText(patches);
    }
    

    N.B。 google-diff-match-patchの公式ビルドをプルダウンする方法を理解するのに少し時間がかかりました。 Mavenを使用します。これは、Mavenの中央リポジトリではなく、googlecode.comの独自のリポジトリにあります。念のために言っておきますが、フォークしてフォークしたバージョンをMaven Centralに配置している人もいますが、公式バージョンが本当に必要な場合は、pom.xmlにリポジトリと依存関係を追加することで入手できます。 次のように

    <repository>
      <id>google-diff-patch-match</id>
      <name>google-diff-patch-match</name>
      <url>https://google-diff-match-patch.googlecode.com/svn/trunk/maven/</url>
    </repository>
    
    <dependency>
      <groupId>diff_match_patch</groupId>
      <artifactId>diff_match_patch</artifactId>
      <version>current</version>
    </dependency>
    

    フロントエンドについては、最新のブログ投稿の全文と、各編集を表す時間的に遡る一連のデルタを渡し、JSのブラウザーで各バージョンの全文を再構築します。

    ライブラリを取得するために、npm+browserifyを使用しています。 ライブラリはnpmで利用できます diff-match-patchとして 。バージョン1.0.0が唯一のバージョンです。

    getTextFromDelta: function(originalText, delta) {
      var DMP = require('diff-match-patch'); // get the constructor function
      var dmp = new DMP();
      var patches = dmp.patch_fromText(delta);
      return dmp.patch_apply(patches, originalText)[0];
    }
    

    それだけです、それは素晴らしく機能します。

    ブログ投稿の編集を保存するという点では、テーブルBLOG_POST_EDITSを使用するだけです。 ここに、ブログ投稿ID、編集が行われたときのタイムスタンプ(後で、クライアントでフルテキストバージョンを再構築するときにチェーンを作成するために編集を正しく順序付けるために使用します)、および現在のライブ間の後方デルタを保存します。 BLOG_POSTのブログ投稿 表、およびブログ投稿の編集済みバージョン。

    デルタの「チェーン」を格納することを選択したのは、それが私のユースケースによく適合し、サーバーコードの終わりでより単純だからです。これは、バージョンMのNを再構築するために、クライアントにN-(M-1)デルタのチェーンをライブブログ投稿のフルテキストからバージョンMに送り返す必要があることを意味します。しかし、私のユースケースでは、とにかく、毎回チェーン全体を送信したいので、これで問題ありません。

    特定のバージョンをリクエストするためのネットワーク上の効率をわずかに向上させるために、編集が行われるたびに、すべてのデルタを新しく編集されたブログ投稿バージョンから各(復元された)バージョンに再計算できますが、これはより多くの作業と複雑さを意味しますサーバー。



    1. PHPWebサイト内のデータベース資格情報を安全に保存する場所

    2. MySQLトリガーは別のテーブルに挿入します

    3. SQLの連続した日

    4. JSONでエンコードされたフィールドにMySQLLIKE演算子を使用する