我们将创建一个MySQL数据库来反映以下PHP类:
会有与内容关联的模型,例如评论,忽略等。
这里的问题是使用哪种数据模型。
1)每个模型一张表
2)一个大型内容表(所有类属性为列),以及其他模型的单个表。我相信它被称为单表继承。
3)一个包含公共字段的大型内容表,或者只包含我们通常搜索的字段(索引),以及一个包含其他属性的大型内容数据表。
4)另一种方式?
我们希望能够查询内容,并获取最近的,基于位置或以某种方式过滤的内容,而不管它是哪种内容类型(子类)。因此,解决方案1可能是不可能的。
该系统应该快速且可扩展。解决这个问题的最佳方法是什么?
答案 0 :(得分:1)
我写了一篇关于这个主题的博客文章,你可能会觉得有用:http://jasonswett.net/blog/composition-a-better-alternative-to-orm-inheritance/
首先,我建议您拨打表content_item
或其他内容而不是content
。原因是我相信表名应该与它所代表的东西的名称相匹配。有关详细信息,请参阅this other blog post of mine。
因此,您可能有一个名为content_item
的表,一个名为article
的表和一个名为post
的表。 content_item
会有title
,slug
等列 - 每个内容项都有的内容,无论是帖子,文章还是其他内容。然后article
会有一个content_item_id
,然后是其他任何特定于文章的内容,但只有特定于文章的内容。对于每篇文章,您都有content_item
条记录,然后是article
记录附加到该content_item
条记录。
这使您能够查询content_item
并获取包含所有内容类型的结果。
我过去实施过这种解决方案并取得了很大的成功。 (我也尝试了不同的方法,并不喜欢它们。)
答案 1 :(得分:0)
如果它们是相似的对象,我会使用选项3 ... a drupals节点概念或当前wordPress的'post'概念
答案 2 :(得分:0)
也许尝试这样的事情。您对帖子与扩展内容的文章的需求可能不同,但不是来自内容的1..many关系 - >发布(或文章),为什么不添加灵活性来混合/匹配任何内容。如果你不需要/不希望这样,那么省略article_content和post_content表,只需分别为每个post和article表添加一个外键content_id INT NOT NULL ..
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)DEFAULT'1',PRIMARY KEY(id),INDEX idx_content_status(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,状态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,status TINYINT(1) DEFAULT'1',PRIMARY KEY(id));
CREATE TABLE IF NOT EXISTS标签(id INT NOT NULL AUTO_INCREMENT,tag VARCHAR(24)NOT NULL,PRIMARY KEY(id));
CREATE TABLE IF NOT NOT EXISTS 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));
CREATE TABLE IF NOT NOT EXISTS 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));
CREATE TABLE IF NOT NOT EXISTS article_tags(article_id INT NOT NULL,tag_id INT NOT NULL,INDEX idx_article_tag_search(article_id,tag_id));
CREATE TABLE IF NOT NOT EXISTS post_tags(post_id INT NOT NULL,tag_id INT NOT NULL,INDEX idx_post_tag_search(post_id,tag_id));