首先,英语不是我的第一语言,随时可以编辑我的问题,我很抱歉任何可能冒犯你的错误,或者没有那么明确地揭露问题。
我有一些带有大量连接的SQL查询,这些连接基于聚簇索引(不用担心)。一些连接仅用于遵循规范化,并且因为维护直观,但有时可以跳过其中一些。在最佳实践方面,我不清楚如何处理这些连接。
编辑:
一个简单的例子:
select *
from things
join things_categories on
things_categories.id_thing = things.id_thing
join categories on
categories.id_category = things_categories.id_category
join categories_properties on
categories_properties.id_category = categories.id_category
where
categories_properties.bo_default = 1
但是可以这样做:
select *
from things
join things_categories on
things_categories.id_thing = things.id_thing
join categories_properties on
categories_properties.id_category = things_categories.id_category
where
categories_properties.bo_default = 1
第二次加入并不是必需的(我确实在数据库级别具有完整性),只是因为使代码更直观并且尊重数据库规范化。我不确定我是否应该遵循尽可能最小和最有效的路径,或者留下不必要的连接以尊重规范化并使代码更直观。
任何提示?
一切顺利。
答案 0 :(得分:1)
它已经延迟,无论你有没有诚信。
一方面,如果categories_properties table
foreign key
中有id_category column
,那么就存在完整性,您无需使用join
{ {1}}。
另一方面,如果完整性可能不存在(即:categories table
中id_categories
中有categories_properties table
未在categories table
中定义),那么您应该{{1} }}
答案 1 :(得分:1)
加入:
join categories on
categories.id_category = things_categories.id_category
是非常必要的,因为categories
表用于下一个连接:
join categories_properties on
categories_properties.id_category = categories.id_category
所以它肯定是必需的,如果它尚未定义,因为SQL要求你建立它需要索引的链接并将其连接到下一个。
select *
是多么令人痛苦的事。
您不需要所有这些信息,因为*将带来所有表中的所有数据。
也许你可以从每个表中指定你需要的东西,或者最坏的情况是使用。*来指定特定表的所有列。
答案 2 :(得分:1)
如果您不需要加入,请不要使用它。您正在完全不受欢迎的性能影响。不要强制数据库执行它不需要执行的工作,因为您认为它看起来更加清晰,您应该在查询中提高可读性之前考虑性能。毕竟,一旦你开始编写高性能的SQl代码,它就会变得更具可读性。但是,通过确保查询的两个版本返回相同的结果集,确保在删除之前确实不需要它。