2

AとBの2つのテーブルがあります。

どのデザインが好ましいですか?

(オールインワン)

表 A: 記事 ID || カテゴリ || サブカテゴリ

または (分離)

表 A: カテゴリ || サブカテゴリ

表 B: 記事 ID || サブカテゴリ

ALLINONE のクエリ:

Select article_id from tableA where article id = foo and
  Category = bar and sub category = baz;

SEPARATED のクエリ:

Select article_id from tableB inner join tableA 
  where tableA.sub-category = tableB.sub-category and tableA.category = Category;

ALL in ONE はポイントに直接的ですが、SEPARATED はよりクリーンです。

どちらがより速く、より推奨されますか?

4

4 に答える 4

2

最初のバージョンでは、すべての階層情報が 1 つのレコードに格納されています

2 番目のバージョンは、階層の最下位レベルを指し、それを介して上位レベルを参照します。

一般に、より正規化されたアプローチ (2 番目のアプローチ) は、そのような関係を表現するより「自然な」方法です。たとえば、「サブカテゴリ」と呼んでいるものは「製品」であり、「カテゴリ」は「製品」の属性である可能性があります。製品を別のテーブルに格納することは非常に理にかなっています。

これを行いたくない状況が (少なくとも) 1 つあります。カテゴリとサブカテゴリの間の関係が時間の経過とともに変化し、特定の時点での関係を維持したい場合があります。これは、緩やかに変化するディメンションと呼ばれます。この場合、サブカテゴリとカテゴリに関するすべての情報を 1 つのレコードに取り込む必要があります。

つまり、一概にどちらのデザインが好ましいとは言えません。通常、2 番目の方法 (より正規化された方法) は、より多くのビジネス上の問題を解決します。最初の方が魅力的な場合もあります。

于 2013-07-02T01:42:02.620 に答える
0

時期尚早に最適化しないでください。正規化されたテーブルから始めるか、より実際の情報を提供してください!

于 2013-07-02T01:16:14.327 に答える
0

article_id表示されているクエリの例では、単一のテーブルを使用し、3 つの列 ( 、category、 )に対して複数列のインデックスを定義すると、より高速になる可能性がありますsubcategory

ただし、後で同じテーブルに対して別のクエリを実行したい場合があることに注意してください。その場合は、別の編成とインデックスを使用することでメリットが得られます。 テーブルではなく、クエリに基づいてパフォーマンスの最適化を決定します。 そのため、データをクエリするすべての方法について何らかの分析を行うことには価値があります。

PS: ==SQL には演算子はありません。

于 2013-07-02T01:27:59.680 に答える
0

分類が非常に単純で基本的なものである場合。つまり、すべての記事が 1 つのカテゴリだけにあり、カテゴリに階層構造がない場合は、1 つのテーブルの最初のデザインを使用できます。それ以外の場合は、別のデザインを使用する必要があります。

于 2013-07-02T02:54:23.463 に答える