1

首先,英语不是我的第一语言,请随时编辑我的问题,对于任何可能冒犯您的错误或没有如此清楚地暴露问题,我深表歉意。

我有一些带有很多连接的 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

第二个连接不是必需的(我在数据库级别确实具有完整性),它的存在只是因为使代码更直观并尊重数据库规范化。我不确定我是否应该遵循尽可能最小和有效的路径,或者留下不必要的连接以尊重规范化并使代码更直观。

有小费吗?

祝一切顺利。

4

3 回答 3

1

这取决于你是否已经诚信。

一方面,如果 中categories_properties table有 a foreign keyid_category column那么完整性就存在,您不需要joincategories table.

另一方面,如果完整性可能不存在(即:存在id_categoriesincategories_properties table中未定义的categories table内容),那么您应该将join.

于 2012-05-11T15:45:26.050 回答
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 *。您不需要所有这些信息,因为 * 将带来所有表中的所有数据。

也许您可以从每个表中指定您需要的内容,或者在最坏的情况下使用 things.* 来指定特定表的所有列。

于 2012-05-11T15:47:28.343 回答
1

如果您不需要加入,请不要使用它。您正在遭受完全不需要的性能打击。不要强迫数据库做它不需要做的工作,因为你认为它看起来更完整,你应该在查询的可读性之前考虑性能。毕竟,一旦你开始编写高性能的 SQl 代码,它对你来说就会变得更具可读性。但是,通过确保两个版本的查询返回相同的结果集来消除它之前,请确保您实际上不需要它。

于 2012-05-11T19:53:59.190 回答