【问题标题】:MySQL headache, should I or should I not?MySQL头痛,我应该还是不应该?
【发布时间】:2011-01-13 15:34:28
【问题描述】:

我有一个分类网站。 我正在使用 SOLR 来索引和存储数据。然后我还有一个 MySQL 数据库,其中包含一些关于我不存储或索引的分类的更多信息。

现在,我有一个包含 4 个表的标准化数据库。

每当在网站上搜索广告时,SOLR 都会进行搜索并返回一个 ID_numbers 数组,然后该数组将用于查询 mysql。 所以 solr 返回 id:s,然后用于从 mysql db 中获取所有具有 THOSE id:s 的广告。

现在,我的表之间的所有 JOIN 和关系都让我头疼。

拥有一个标准化的数据库,除了易于维护之外,我还能得到什么?

你知道吗,将所有信息存储到一个大约有 50 列的表中。

因此,而不是这个寻找一个广告并显示它:

SELECT 
  category_option.option_name,
  option_values.value 
FROM classified, category_option, option_values 
WHERE classified.classified_id=?id 
AND classified.cat_id=category_options.cat_id 
AND option_values.option_id=category_options.option_id

我可以用这个:

SELECT * FROM table_name WHERE classified_id = $classified_id

最后一个实际上不是更快吗? 还是标准化的数据库执行得更快?

谢谢

【问题讨论】:

    标签: php sql mysql database normalization


    【解决方案1】:

    我建议不要在您的情况下进行非规范化。当您更多地使用连接时,您会变得更好,并且它们开始在您的脑海中变得更加清晰,并且易于维护对未来来说是一个很好的好处。

    Here 是关于规范化(和非规范化)的一个很好的链接。 Here 是关于非规范化的问题。一个答案建议使用连接创建一个视图来获取您需要的数据,并像您的SELECT * FROM table_name WHERE classified_id = $classified_id 查询一样使用它。规范化的数据库可能会更慢,但由于这个原因,您不太可能想要非规范化。我希望这能提供一些帮助。

    【讨论】:

      【解决方案2】:

      每当您进行非规范化时,您通常会提高读取速度并降低写入速度,因为您必须多次写入相同的值。此外,应特别注意维护数据完整性。

      • 查询将执行多少次?
      • 这是一个高流量的应用程序吗?
      • 可以添加缓存吗?

      【讨论】:

      • 我必须添加一个缓存是的,但这与规范化有什么关系?因为结果是缓存而不是数据库我对吗?
      • 流量也很大,你的意思是查询会执行多少次?我猜每次用户点击“搜索”时只有一次......对不起,但你必须解释得更详细一点
      • 我的意思是建议添加缓存是考虑性能改进的其他替代方案。
      【解决方案3】:

      就 MySQL 连接而言,使用 JOIN 的查询是微不足道的。我认为没有必要对此进行非规范化。

      不过,我建议将其重写为不适合阅读的 PITA:

      SELECT 
        category_option.option_name,
        option_values.value 
      FROM classified
      JOIN category_option USING (cat_id)
      JOIN option_values USING (option_id)
      WHERE classified.classified_id = ?
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-03
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 2012-01-06
        • 2022-08-15
        • 2012-02-10
        • 1970-01-01
        相关资源
        最近更新 更多