MySQL头痛,我应该或不应该?

时间:2010-02-05 18:44:50

标签: php sql mysql database normalization

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

现在,我有一个非常规范化的数据库,有4个表。

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

现在,我桌子之间的所有JOIN和关系让我很头疼。

除了maintanance-ease之外,我还能获得标准化数据库吗?

我知道,将所有信息存储到一个包含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

最后一个实际上不是更快吗? 或者规范化的数据库是否会更快地运行?

由于

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

我建议不要在你的情况下反规范化。当你使用它们时,你会更好地使用它们,并且它们开始变得更加清晰,维护轻松对未来是一个很好的好处。

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

答案 2 :(得分:2)

就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 = ?