2012-05-11 16 views
1

まず第一に、英語は私の母国語ではなく、私の質問を編集することができます。あなたを怒らせたり、問題を明らかにするような間違いがあれば、すみません。tsqlベストプラクティスアドバイス

私はたくさんの結合を持ついくつかの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

これは実際の質問imhoではないので、私はあなたが何か有用な答えを得ることは疑う。 – YvesR

+0

私はあなたに同意しないが、とにかくありがとう。 – user1330271

+0

あなたが直面している問題は何ですか?つまり何が変わるべきなのか、そしてなぜなのでしょうか? – ericosg

答えて

1

これはあなたが既に健全かどうかを判断します。 categories_properties tableid_category columnforeign keyを持っている場合は、1本の手で

は、その後、整合性が存在し、あなたはcategories tablejoinを行う必要はありません。一方

、整合性が存在しない可能性がある場合(すなわち: categories tableで定義されていない categories_properties tableid_categoriesがある)、そして、あなたは joinを行う必要があります。

+0

完全性が存在します(データベースレベル)。しかし、これらのステップをスキップするとコードが読みにくくなり、不要なステップをとらえてしまう傾向があります。 – user1330271

+1

それはパフォーマンスです(それほどの影響はありません)。 –

+0

ええ、私はクラスタ化されたキーに必要なステップを使用していると考えています。パフォーマンスにそれほど悪いですか? – user1330271

1

参加:それはすでに定義されていない場合は、SQLが必要と

join categories_properties on 
    categories_properties.id_category = categories.id_category 

をだから、それは間違いなく、必須です:categoriesテーブルは次の結合に使用されているので、

join categories on 
    categories.id_category = things_categories.id_category 

は、非常に必要ですインデックスを作成し、次のインデックスに参加するために必要なリンクを確立する必要があります。

ただし、非常に痛いのは、select *です。 *すべてのテーブルからすべてのデータを取得するので、すべての情報は必要ありません。

おそらく、各テーブルから必要なものを指定したり、最悪の場合は*。を使用して特定のテーブルのすべての列を指定することができます。

+0

*はサンプルであるためにのみ使用されます。私はすでに他のテーブルに参加する必要があるid_categoryを持っているので、私はcategoriesテーブルをスキップする次の結合を行うことができます。 – user1330271

1

参加が必要ない場合は、使用しないでください。あなたは全く不必要なパフォーマンスヒットをしています。より多くの情報が必要と思われるためデータベースに行う必要のない作業をデータベースに強制しないでください。クエリの可読性よりも先にパフォーマンスを考慮する必要があります。結局、パフォーマンスの良いSQlコードの作成が始まると、それはあなたにとってより読みやすくなります。ただし、両方のバージョンのクエリーが同じ結果セットを返すようにする前に、実際にそれを削除する必要はありません。