2

我们将创建一个 MySQL 数据库来反映以下 PHP 类:

  • 内容
  • 文章扩展内容
  • 帖子扩展内容
  • ...

会有与内容相关的模型,如评论、忽略等。

这里的问题是使用哪种数据模型。

1) 每个型号一张桌子

2)一个大的内容表(所有类属性作为列),加上其他模型的单个表。我相信它被称为单表继承。

3) 一个带有公共字段的大型内容表,或者只有我们通常搜索的字段(索引),加上一个大型内容数据表,以及其余的属性。

4)另一种方式?

我们希望能够查询内容,并获取最近的、基于位置的或以某种方式过滤的内容,而不管它是哪种内容类型(子类)。因此解决方案 1 可能是不可能的。

这个系统应该是快速和可扩展的。解决这个问题的最佳方法是什么?

4

3 回答 3

1

我写了一篇关于这个主题的博客文章,你可能会觉得有帮助:http: //jasonswett.net/blog/composition-a-better-alternative-to-orm-inheritance/

首先,我想建议你打电话给你的桌子content_item或其他东西,而不是content. 这样做的原因是我相信表名应该与它所代表的事物的名称相匹配。有关详细信息,请参阅我的另一篇博客文章

因此,您可能有一个名为content_item的表、一个名为 的表article和一个名为 的表postcontent_item会有 , 等列title-slug每个内容项都会有的所有内容,无论是帖子、文章还是其他内容。然后article会有一个content_item_id,然后是任何其他特定于文章的内容,但只有特定于文章的内容。对于每篇文章,您都会有一条content_item记录,然后是一条article附加到该记录的content_item记录。

这将使您能够查询content_item和获取包含所有内容类型的结果。

我过去曾成功实施过这种解决方案。(我也尝试过不同的方法,但不太喜欢它们。)

于 2012-07-13T16:30:56.593 回答
0

如果它们是足够相似的对象,我会使用选项 3... 一个 la drupals 节点概念或当前 wordPress 的“帖子”想法

于 2012-07-13T15:48:52.983 回答
0

也许尝试这样的事情。您对文章和文章扩展内容的需求可能不同,但不是从内容 -> 文章(或文章)的 1..many 关系,为什么不增加在任何内容中混合/匹配内容的灵活性。如果您不需要/不希望这样做,则省略 article_content 和 post_content 表,只需将外键 content_id INT NOT NULL 分别添加到每个 post 和 article 表。


CREATE TABLE IF NOT EXISTS content (id INT NOT NULL AUTO_INCREMENT, title VARCHAR(32) NOT NULL, description VARCHAR(255) NULL, body TEXT, published DATETIME NOT NULL, updated DATETIME NULL, owner_id INT DEFAULT '0', status TINYINT( 1)默认'1',主键(id),索引idx_content_status(状态));

CREATE TABLE IF NOT EXISTS article (id INT NOT NULL AUTO_INCREMENT, title VARCHAR(32) NOT NULL, excerpt VARCHAR(255) NULL, url_slug VARCHAR(64) NOT NULL, author_id INT NOT NULL, 发布的 DATETIME NOT NULL, 更新的 DATETIME NULL, status TINYINT(1) DEFAULT '1', sort_order INT DEFAULT '1', PRIMARY KEY (id), UNIQUE INDEX idx_article_slug(url_slug), INDEX idx_article_search(title, published, status, sort_order));

CREATE TABLE IF NOT EXISTS post (id INT NOT NULL AUTO_INCREMENT, title VARCHAR(32) NOT NULL, comment VARCHAR(128) NULL, author_id INT NOT NULL, 发布的 DATETIME NOT NULL, 更新的 DATETIME NULL, 状态 TINYINT(1) DEFAULT '1 ',主键(id));

如果不存在标签,则创建表(id INT NOT NULL AUTO_INCREMENT,标签 VARCHAR(24) NOT NULL,PRIMARY KEY (id));

如果不存在则创建表 article_content (article_id INT NOT NULL, content_id INT NOT NULL, status TINYINT(1) DEFAULT '1', sort_order INT DEFAULT '1', INDEX idx_article_content_search(article_id, content_id, status, sort_order));

如果不存在 post_content (post_id INT NOT NULL, content_id INT NOT NULL, status TINYINT(1) DEFAULT '1', sort_order INT DEFAULT '1', INDEX idx_post_content_search(post_id, content_id, status, sort_order)),则创建表;

如果不存在,则创建表 article_tags (article_id INT NOT NULL, tag_id INT NOT NULL, INDEX idx_article_tag_search(article_id, tag_id));

如果不存在 post_tags (post_id INT NOT NULL, tag_id INT NOT NULL, INDEX idx_post_tag_search(post_id, tag_id)),则创建表;

于 2012-07-13T17:05:56.087 回答