【问题标题】:Structuring PHP code to link object creation and db writes?构建 PHP 代码以链接对象创建和数据库写入?
【发布时间】:2012-09-03 14:18:20
【问题描述】:

我正在编写一个站点(PHP + MySQL),其中一些对象(比如文章)按集合组织。每篇文章都属于一个单例集。每个集合可以是独立的,也可以属于更大的集合。集合要么是单例,要么是集合的集合。为了跟踪集合之间的关系,我使用了一个封闭表来跟踪所有“家庭联系”。该表有一个ancestor 字段、一个descendant 字段和一个length 字段,用于计算祖先和后代之间的分离度。

  • 每篇新文章都意味着创建一个新的单例集。
  • 每个新集合都意味着创建一个新的闭包表条目,其中ancestordescendant 相同且length=0。由于集合可以是现有集合的集合,因此可以独立于文章创建新集合。

我想构造我的 PHP 程序,这样每次我在数据库中写一篇新文章时,我都会自动编写一个新集合,并且每次加载一个新集合时,我都会自动编写一个新的闭包表条目。

构建代码的正确方法是什么?是否创建嵌套对象(article 对象包括一个set,它本身包括一个closure)和一个在数据库上写入的递归函数,该函数将首先写入嵌套对象(以及结束条件的位置)如果对象是一个闭包表条目)?有没有办法将这些递归写入折叠到单个事务中?

我可以使用现有的模式吗?

【问题讨论】:

    标签: php mysql oop design-patterns pdo


    【解决方案1】:

    答案很简单。嵌套对象有些正确,但顺序相反。

    在 is-a 关系中查看它。一篇文章是一个集合的一部分,但在一个集合中可以是多篇文章。一个集合可以是另一个集合的一部分,但在这个另一个集合中可以是多个较低的集合。低的不应该知道高的。

    结构如何?

    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 从数据库中知道一篇文章属于它(独立集)还是其他集(集的集合)。所以它有两个属性。第一个是可为空的文章引用变量,第二个是子集对象的数组(可以为空)。 Article 从数据库中只知道它自己的属性,并且它不知道与任何集合的关系。

    如何处理链接?

    如果您在控制器ArticleAdd 中创建文章,您将创建文章和独立集。然后将包含 articleID 和 setID 的行插入到表 article_to_set 中。 如果您创建一个没有文章的新集合a,则在开始时它是空的。如果您随后添加新集合(直接或通过文章),您可以通过向表 set_to_set 添加行将它们放入集合 a,其中 parentSetID 是集合 a 的 ID,setID 是您放入集合a的集合ID。

    此解决方案不使用闭包表,但它使设计更适合未来的编辑。通过添加一行可以轻松地将一组放入另一组中。

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 2013-12-29
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多