博客文章表结构 - MySQL

时间:2011-05-08 18:16:04

标签: mysql sql database-design

我创建了2个用于存储文章信息的表。

KB_Parent

  • ID [pk]
  • 标题
  • 标记
  • UID
  • AUTHORNAME

KB_Detail

  • ID [pk]
  • UID
  • 作者名称
  • 标题
  • 标记
  • 文本

我创建了用于搜索和列出最新文章用途的KB_Parent表和用于显示文章详细信息的KB_Detail表。
由于KB_Parent将仅用于搜索我所需的MyISAM FullText和另一个表InnoDB

我对我的桌子是否正确或只是一张桌子可以解决这个问题?

我避免使用外键,所以我不必运行内部查询或连接来获取结果

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

你没有在问题中明确说明这一点,但我假设你想要采用这种设计,原因如下:

  • 文本字段很大,您希望在显示摘要数据时需要返回大量行(或者更糟糕的是,您有时需要执行表扫描以获取摘要行列表)。出于性能原因,您试图跳过不必要的文本字段读取。
  • MyISAM支持全文搜索,而InnoDB则不支持,因此您可以将MyISAM用于您将使用全文搜索的表格。

我会验证断言1是否真的正确。如果摘要查询可能使用单个索引并且可能返回少量行,则断言1不正确。只是崩溃到一张桌子。

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

如果您使用两个表,我不明白为什么要重复这些数据。如果有人选择查看行的详细信息,您将从摘要行中获得标题/作者等(因此您不需要进行JOIN查询)。

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