2012-09-10 19 views
2

我正在寫一個站點(PHP + MySQL),其中一些對象(比如說文章)是按組來組織的。每篇文章屬於一個單獨集。每組可以獨立或屬於一個更大的集合。一個集合可以是單例,也可以是集合的集合。爲了跟蹤集合之間的關係,我使用了一個跟蹤所有「家庭鏈接」的閉合表。該表具有ancestor字段,descendant字段和length字段,該字段計算祖先和後代之間的分離度。構造PHP代碼來鏈接對象創建和db寫入?

  • 每篇新文章都意味着創建一個新的單例集。
  • 每個新的集合意味着創建一個新的閉包表條目,其中ancestordescendant是相同的,並且其中length = 0。由於集合可以是現有集合的集合,因此可以獨立於文章創建新集合。

我要組織我的PHP程序,使得每當我寫一個數據庫中的新文章的時候,我會自動編寫了一套新的,每個我打開一個新設定的時間,我會自動寫入一個新的封閉表項。

什麼是構建我的代碼的正確方法?它是創建嵌套對象(article對象包括set,其本身包括一個closure)和一個遞歸函數來寫入數據庫,它將首先編寫嵌套對象(如果對象是閉包,則結束條件是表條目)?有沒有辦法在單個事務中摺疊這些遞歸寫入?

是否有我可以使用的現有模式?

回答

0

答案非常簡單。嵌套對象有點正確,但順序相反。

看看它是否是一個關係。文章是一個集合的一部分,但在一個集合可以是多個文章。一個集合可以是另一個集合的一部分,但在這個集合中可以是多個較低集合。較低者不應該知道較高者。

結構如何?

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類構成的?

SetSet從數據庫中知道文章是屬於它(獨立集合)還是其他集合(集合集合)。所以它有兩個屬性。第一個是可以爲空的文章引用變量,第二個是子集對象的數組(可以是空的)。 Article從數據庫中知道它只有它自己的屬性,它不知道與任何集合的關係。

鏈接是如何處理的?

如果您在控制器ArticleAdd中創建了一篇文章,您可以創建文章和獨立集。然後,您將具有articleID和setID的行插入表article_to_set。 如果您創建一個沒有文章的新集合a,它在開始時是空的。如果您隨後添加新套件(直接或通過物品),則可以通過向表set_to_set添加行將其放入集a中,其中parentSetID是集a的ID,setID是放入設置爲a

該解決方案不使用閉合表,但它使得設計對未來的編輯更好。把一組放入另一組可以很容易地通過添加一行來完成。