2

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

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

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

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

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

4

1 回答 1

0

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

在 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没有文章的新集合,则它在开始时为空。a如果您随后添加新集合(直接或通过文章),您可以通过向表中添加行将它们放入集合中set_to_set,其中parentSetID是集合a的 ID,setID 是您放入集合的集合的 ID a

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

于 2013-07-27T10:25:14.070 回答