我们将创建一个MySQL数据库,以反映以下PHP类:
会有与内容相关的模型,如评论、忽略等等。
这里的问题是使用哪种数据模型。
1)每个模型一张表
2)一个大的内容表(所有类属性都作为列),加上其他模型的单个表。我相信这叫做单表继承。
3)一个包含公共字段的大内容表,或者只有我们通常在(索引)上搜索的字段,再加上一个包含其余属性的大型内容数据表。
4)另一种方式?
我们希望能够对内容进行查询,并获得最近的、基于位置的或某种方式过滤的内容,而不管它是哪种内容类型(子类)。因此,解决方案1可能是不可能的。
这个系统应该是快速和可扩展的。解决这个问题最好的办法是什么?
发布于 2012-07-13 16:30:56
我写了一篇关于这个话题的博文,你可能会发现它很有帮助:http://jasonswett.net/blog/composition-a-better-alternative-to-orm-inheritance/
首先,我建议您将表称为content_item或其他东西,而不是content。原因是我认为表名应该与它所代表的事物的名称相匹配。有关这方面的详细信息,请参见我的另一篇博文。
因此,您可能有一个名为content_item的表、一个名为article的表和一个名为post的表。content_item将有title、slug等列--每个内容项所包含的所有内容,无论是帖子、文章还是其他内容。然后article将有一个content_item_id,然后是任何特定于文章的内容,但只包含特定于文章的内容。对于每一篇文章,您都有一个content_item记录,然后是一个附加到该content_item记录的article记录。
这将使您能够查询content_item并获得包含所有内容类型的结果。
我在过去已经成功地实现了这种解决方案。(我也尝试过不同的方法,但不太喜欢它们。)
发布于 2012-07-13 15:48:52
如果它们是非常相似的对象,我会使用选项3..。la drupals节点概念或当前“post”的wordPress概念
发布于 2012-07-13 17:05:56
也许可以试试这样的东西。您对post与扩展内容的文章的需求可能有所不同,但与内容-> post (或文章)不同的是,为什么不添加灵活性以在任何内容中混合/匹配内容。如果您不需要/希望这样做,那么省略article_content表和post_content表,只需向每个post表和文章表分别添加一个外键content_id INT NULL。
如果不存在内容,则创建表(id INT NULL AUTO_INCREMENT,title VARCHAR(32) NULL,description VARCHAR(255) NULL,正文文本,已发布日期时间NULL,更新日期时间NULL,owner_id INT (1)默认'1',状态TINYINT(1)默认‘1’,主键(id),索引idx_content_status (状态));
如果不存在项目,则创建表(id INT非空AUTO_INCREMENT,title VARCHAR(32) NULL,摘录VARCHAR(255) NULL,url_slug VARCHAR(64) NULL,author_id INT NULL,已发布日期时间NULL,更新日期时间NULL,状态TINYINT(1)默认'1',sort_order INT默认值'1',主键(id),唯一索引idx_article_slug(url_slug),索引idx_article_search(标题,已发布,状态,sort_order));
创建表如果不存在post (id INT NULL AUTO_INCREMENT,标题VARCHAR(32) NULL,注释VARCHAR(128) NULL,author_id INT NULL,已发布日期时间NULL,更新日期时间NULL,状态TINYINT(1)默认'1',主键(id));
如果不存在标签,则创建表(id INT NOT NULL AUTO_INCREMENT,标记VARCHAR(24) NOT NULL,主键(id));
如果不存在article_content,则创建表(article_id INT NULL,content_id INT NULL,状态TINYINT(1)默认'1',sort_order INT默认'1',索引idx_article_content_search(article_id,content_id,status,sort_order));
如果不存在post_content,则创建表(post_id INT NULL,content_id INT NULL,状态TINYINT(1)默认'1',sort_order INT默认'1',索引idx_post_content_search(post_id,content_id,status,sort_order));
创建表,如果不存在article_tags (article_id INT NULL,tag_id INT NULL,索引idx_article_tag_search(article_id,tag_id));
创建表,如果不存在post_tags (post_id INT NULL,tag_id INT NULL,索引idx_post_tag_search(post_id,tag_id));
https://stackoverflow.com/questions/11473791
复制相似问题