2

いくつかのオブジェクト(たとえば、記事)がセットで編成されているサイト(PHP + MySQL)を書いています。各記事はシングルトンセットに属しています。各セットは、スタンドアロンにすることも、より大きなセットに属することもできます。セットはシングルトンであるか、セットのコレクションです。セット間の関係を追跡するために、すべての「ファミリーリンク」を追跡するクロージャーテーブルを使用します。テーブルには、ancestorフィールド、descendantフィールド、およびlength祖先と子孫の間の分離度をカウントするフィールドがあります。

  • それぞれの新しい記事は、新しいシングルトンセットの作成を意味します。
  • ancestorそれぞれの新しいセットは、とdescendantが同じであり、length=0である新しいクロージャテーブルエントリの作成を意味します。セットは既存のセットのコレクションである可能性があるため、新しいセットは記事とは独立して作成できます。

PHPプログラムを構造化して、データベースに新しい記事を書き込むたびに自動的に新しいセットを書き込み、新しいセットをロードするたびに新しいクロージャーテーブルエントリを自動的に書き込むようにします。

コードを構造化する正しい方法は何ですか?ネストされたオブジェクト(articleオブジェクトには、が含まれset、それ自体にはが含まれますclosure)と、ネストされたオブジェクトを最初に書き込むデータベースに書き込む再帰関数(およびオブジェクトがクロージャテーブルエントリの場合の終了条件)を作成することですか? ?これらの再帰的な書き込みを単一のトランザクション内に折りたたむ方法はありますか?

使用できる既存のパターンはありますか?

4

1 に答える 1

0

答えは非常に簡単です。ネストされたオブジェクトは多少正しいですが、逆の順序です。

is-a関係でそれを見てください。記事はセットの一部ですが、1つのセットに複数の記事を含めることができます。セットは別のセットの一部である可能性がありますが、この別のセットでは複数の下位セットである可能性があります。低い方は高い方を知らないはずです。

構造はどのように見えますか?

CREATE TABLE article (
    articleID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    // some other columns that don't matter for this structure answer
);

CREATE TABLE set (
    setID INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    // some other columns that don't matter
);

CREATE TABLE article_to_set (
    articleID INT(10) NOT NULL,
    setID INT(10) NOT NULL,
    UNIQUE KEY (articleID, setID)
);

CREATE TABLE set_to_set (
    setID INT(10) NOT NULL,
    parentSetID INT(10) NOT NULL,
    UNIQUE KEY (setID, parentSetID)
);

PHPクラスはどのように構成されていますか?

Set記事がデータベースに属しているか(スタンドアロンセット)、他のセット(セットのコレクション)であるかをデータベースから認識します。したがって、2つのプロパティがあります。1つ目はnull許容の記事参照変数で、2つ目はサブセットオブジェクトの配列です(空にすることができます)。はArticleデータベースからそれ自身のプロパティのみを知っており、セットとの関係からは何も知りません。

リンクはどのように処理されますか?

コントローラArticleAddで記事を作成する場合は、記事とスタンドアロンセットを作成します。次に、articleIDとsetIDの両方を含む行をテーブルに挿入しますarticle_to_seta記事なしで新しいセットを作成する場合、開始時には空です。a次に(直接または記事を介して)新しいセットを追加する場合は、テーブルに行を追加することでそれらをセットに入れることができますset_to_set。ここで、parentSetIDはセットのaIDであり、setIDはセットに入れたセットのIDですa

このソリューションはクロージャーテーブルを使用しませんが、将来の編集のためにデザインを大幅に改善します。また、1つの行を追加することで、あるセットを別のセットに簡単に配置できます。

于 2013-07-27T10:25:14.070 に答える