博客文章表结构-MySQL

博客文章表结构-MySQL,mysql,sql,database-design,Mysql,Sql,Database Design,我创建了两个表来存储文章信息 家长 ID[pk] 头衔 标签 液体 作者姓名 知识库详情 ID[pk] 液体 作者姓名 头衔 标签 正文 我创建了用于搜索和列出最新文章目的的KB_父表,以及用于显示文章详细信息的KB_详细信息表。 由于KB_父项将仅用于搜索,因此我将输入MyISAM全文,并输入另一个表InnoDB 我对表格的看法正确吗?还是一张表格就可以解决问题? 我避免使用外键,因此不必运行内部查询或联接来获取结果如果这两个表之间的唯一区别在于“文本”字段,那么您应该只使用KB_De

我创建了两个表来存储文章信息

家长
  • ID[pk]
  • 头衔
  • 标签
  • 液体
  • 作者姓名
知识库详情
  • ID[pk]
  • 液体
  • 作者姓名
  • 头衔
  • 标签
  • 正文
我创建了用于搜索和列出最新文章目的的KB_父表,以及用于显示文章详细信息的KB_详细信息表。
由于KB_父项将仅用于搜索,因此我将输入
MyISAM全文
,并输入另一个表
InnoDB

我对表格的看法正确吗?还是一张表格就可以解决问题?


我避免使用外键,因此不必运行内部查询或联接来获取结果

如果这两个表之间的唯一区别在于“文本”字段,那么您应该只使用KB_Detail表。使用这两个表没有任何好处。

您在问题中没有明确说明这一点,但我假设您希望使用此设计,原因如下:

  • 文本字段很大,您希望在显示摘要数据时返回大量行(或者更糟的是,有时需要进行表扫描以获取摘要行列表)。由于性能原因,您正在尝试跳过不必要的文本字段读取
  • MyISAM支持全文搜索,而InnoDB不支持全文搜索,因此您可以在将使用全文搜索的表中使用MyISAM
我将验证断言1是否真的正确。如果摘要查询可能使用单个索引,并且可能返回少量行,则断言1不正确。就挤到一张桌子上

如果断言1是正确的,并且性能差异很大,那么是的,最好有两个表。但是,如果您使用两个表,我将避免使用MyISAM,因为它不支持事务(即,如果insert出错,您可能会进入两个表中只有一个表存在的状态),并且它不支持外键。虽然InnoDB本机不支持全文搜索,但您可以使用开源外部开源全文搜索引擎(如Sphinx)

如果你使用两个表,我不明白你为什么要重复这些数据。如果有人选择查看某行的详细信息,那么您将已经拥有摘要行中的标题/作者等(因此您不需要执行联接查询)


我也看不出你有什么反对外键的。它们将允许您在两个表之间保持主要的引用完整性。外键的唯一实际成本是添加/删除/修改行(需要额外的按索引查找以确保另一个表中的行存在)。当您在联接两个表时需要执行查询时,它并不昂贵(因为数据库可以通过从第一个表中获取的主键查找第二个表->最有可能通过嵌套循环联接联接两个表)。

您的两个假设都是正确的,等待您推荐的表结构!您希望文本行有多大?您希望显示多少个摘要行?数据库中总共有多少行?数据库有多少RAM可用于缓存?您希望文本行有多大?[2000-6000个字母]您希望显示多少个摘要行?[上次提交10]数据库中总共有多少行?[我还没有启动这项服务]数据库有多少RAM可用于缓存?[128MB]2000-6000个字符?文本列没有那么大。如果您正在进行FTS以生成摘要的记录列表,则不应该进行表扫描(因为FTS引擎应该为您提供PK索引)。我现在只需要使用MyISAM折叠到一个表(即ID[pk],UID,AuthorName,Title,Tag,Text)。稍后,如果您开始遇到性能问题,请迁移到以下表结构([第一个表-ID[pk],Title,Tag,UID,AuthorName],[第二个表-ID[pk,fk],Text])。这些表将是InnoDB,您可以使用Sphinx全文搜索引擎。