2017-10-01 17 views
0

現在、書籍や記事を作成したり変更したりするツールを開発中です。多言語データとツリー構造の両方をバージョン管理する方法を教えてください。

  • 本は、記事が含まれており、具体的な構造を有している
  • それは多言語であるため、各記事は、(それだけには持っていない)ことができますが、持っている同じブック内に複数回発生する可能性があります記事異なる言語。 (選択した言語のデータがない場合は、通知などを表示するだけです)
  • 後で新しい言語を追加することができます。
  • 深度/ネスティングは動的ですこちらの記事)
  • 記事だけでなく、構造の両方がバージョンする必要があります(私は後に特定の状態を復元できるようにする必要があります)

は、データベースのための私の現在のアプローチです: current database structure

これで、私はg私は記事の新しいバージョンを作成した場合、私は反映するために、最新の構造を更新する必要が

  • :RABこのような本の最新版:しかし、これはという

    SELECT * 
    FROM books AS b 
    JOIN structure AS s ON s.book_fk = b.id 
    AND s.book_version_nr = 
    (
        SELECT MAX(s2.book_version_nr) 
        FROM structure AS s2 
        WHERE s2.book_fk = b.id 
    ) 
    JOIN articles AS a ON a.id = s.article_fk 
    JOIN article_texts AS as ON as.article_fk = a.id 
    AND as.version_nr = s.article_version_nr 
    AND as.language_fk = 'languageIdFromScript' 
    WHERE b.id = 'bookIdFromScript' 
    ORDER BY s.position ASC 
    

    を意味します

  • 記事を追加、削除、または移動すると、わずかな変更のために全く新しい構造バージョンを作成する必要があります(これはデータベース内の膨大な量のデータを実際に高速にし、潜在的にクエリ時間に影響する)

このアプローチは、単一のブック構造で参照される同じ記事の異なる言語の異なるバージョンを持つことができないため、私が本当に望むものではないようです。また、サブセレクトはプロセス全体を大幅に遅くしているようです。

この接続を表現する方法はありますか、パフォーマンス上の問題を回避する方法はありますか?

答えて

0

次の点を考慮してください。構造体に2つのテーブルがあります。Current構造体の1つ。これは変更が発生するたびに更新されます。もう1つは構造のHistoryです。

変更する場合は、現在の構造をCurrentからHistoryにコピーしてからCurrentを変更してください。

これは、挿入と更新の速度を落としますが、選択を簡略化します。

Historyの複数の行は、同じArticles,Usersなどを指しますが、それでも問題ありません。

関連する問題