我有一个分类广告网站。 我正在使用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
最后一个实际上不是更快吗? 或者规范化的数据库是否会更快地运行?
由于
答案 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 = ?