类似类对象的推荐MySQL数据模型

类似类对象的推荐MySQL数据模型,mysql,datamodel,Mysql,Datamodel,我们将创建一个MySQL数据库,以反映以下PHP类: 内容 文章扩展了内容 帖子扩展了内容 将有与内容相关的模型,如注释、忽略等 这里的问题是使用哪种数据模型 1) 每个型号一张表 2) 一个大型内容表(所有类属性均为列),以及其他模型的单个表。我相信这叫做单表继承 3) 包含公共字段的大型内容表,或仅包含我们通常搜索的字段(索引),以及包含其余属性的大型内容数据表 4) 另一种方式 我们希望能够查询内容,并获取最新的、基于位置的或以某种方式过滤的内容,而不管它是哪种内容类型(子类)。因此

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

  • 内容
  • 文章扩展了内容
  • 帖子扩展了内容
将有与内容相关的模型,如注释、忽略等

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

1) 每个型号一张表

2) 一个大型内容表(所有类属性均为列),以及其他模型的单个表。我相信这叫做单表继承

3) 包含公共字段的大型内容表,或仅包含我们通常搜索的字段(索引),以及包含其余属性的大型内容数据表

4) 另一种方式

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


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

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

我写了一篇关于这个主题的博客文章,你可能会觉得很有帮助:

首先,我建议您将表命名为
content\u item
或其他名称,而不是
content
。原因是我认为表名应该与它所代表的事物的名称相匹配。有关详细信息,请参阅

因此,您可能有一个名为
content\u item
的表,一个名为
article
的表和一个名为
post
的表<代码>内容\u项会有类似于
标题
slug
等列-每个内容项都会有,无论是帖子、文章还是其他内容。然后,
article
将有一个
content\u item\u id
以及其他任何特定于文章的内容,但仅限于特定于文章的内容。对于每篇文章,您将有一个
content\u项
记录,然后是一个
文章
记录,该记录附加到该
content\u项
记录

这将使您能够查询
内容\u项目
,并获得包含所有内容类型的结果


我在过去实施过这种解决方案,并取得了良好的成功。(我也尝试过不同的方法,但不太喜欢。)

试试这样的方法吧。您对文章与文章扩展内容的需求可能有所不同,但与其与内容->文章(或文章)建立1..many关系,不如增加灵活性,在任何内容中混合/匹配内容。如果您不需要/不希望这样做,那么省略article_content和post_content表,只需分别向每个post和article表添加一个外键content_id INT NOT NULL


如果内容不存在,则创建表(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))

创建表格如果不存在文章(id INT NOT NULL自动递增,title VARCHAR(32)NOT NULL,摘录VARCHAR(255)NULL,url slug VARCHAR(64)NOT NULL,author id INT NOT NULL,published DATETIME NOT NULL,updated DATETIME NULL,status TINYINT(1)默认值“1”,排序顺序INT默认值“1”,主键(id),唯一索引idx_article_slug(url_slug),索引idx_文章搜索(标题、发布、状态、排序顺序)

创建表如果不存在post(id INT NOT NULL自动递增,标题VARCHAR(32)NOT NULL,注释VARCHAR(128)NULL,作者id INT NOT NULL,发布日期时间NOT NULL,更新日期时间NULL,状态TINYINT(1)默认值“1”,主键(id))

如果不存在标记(id INT NOT NULL AUTO_INCREMENT,tag VARCHAR(24)NOT NULL,主键(id)),则创建表

如果不存在项目内容,则创建表(项目id INT不为NULL,内容id INT不为NULL,状态TINYINT(1)默认值“1”,排序顺序INT默认值“1”,索引idx项目内容搜索(项目id,内容id,状态,排序顺序))

创建表,如果不存在post_内容(post_id INT NOT NULL,content_id INT NOT NULL,status TINYINT(1)默认值“1”,排序顺序INT默认值“1”,索引idx_post_内容搜索(post_id,content_id,status,sort_order))

如果不存在项目标签(项目id INT不为空,项目id INT不为空,索引idx项目标签搜索(项目id,项目id)),则创建表


如果不存在post_标记(post_id INT不为NULL,tag_id INT不为NULL,INDEX idx_post_tag_搜索(post_id,tag_id)),则创建表

个人,我通常使用选项2,因为选项3让人想起EAV,许多顶级开发人员认为这是反模式。你可以简单地查看WordPress模式并复制它。为什么要重新发明轮子?我同意内容项的命名。如果你想要100个最新的内容项,你会如何查询这种数据库?这里的问题是,您希望在不同的表上进行连接,这取决于内容项的类型(文章、帖子等)。
SELECT*FROM content\u item join article.content\u item\u id=content\u item.id join post.content\u item\u id=content\u item.id ORDER BY content\u item.id DESC LIMIT 100
您将如何查询此类数据库,如果说,您想要100个最新的内容项?这里的问题是,根据内容项(文章、帖子等)的类型,您希望通过不同的表进行连接。