0

私は新しいアプリケーションのデータベース スキーマをゼロから構築しています。私の 2 つの目標は、疎結合 (スケーラビリティ) とパフォーマンス (ただし、パフォーマンスが最も重要です) です。中央のテーブルに外部キー列を含めるのが良い考えかどうかはわかりません。私の質問は、おそらく例を使用して最もよく理解できるでしょう (この例は純粋に仮説に過ぎないことに注意してください):

テーブルがあります。このテーブルを「アニマル」と呼びましょう。このテーブルには、データベースに格納されているさまざまなタイプの「動物」のプロパティを定義するいくつかのエントリがあります。「AnimalName」という別のテーブルもあります。その目的は、各動物の名前を「動物」テーブルに言語 ID と組み合わせて格納することです (したがって、各動物の名前を「動物」の表を各言語で)。

上記の表を実装するには、次の 2 つの方法があります。

最初の道

動物テーブル: AnimalID (PK)
AnimalName テーブル: AnimalNameID (PK)、AnimalID (FK)、LanguageID (FK)、名前

クエリは次のようになります。

SELECT * FROM Animal a JOIN AnimalName an ON an.AnimalID = a.AnimalID and an.LanguageID = ? WHERE a.AnimalID = ?

第二の道

動物テーブル: AnimalID (PK)、AnimalNameID (FK)
AnimalName テーブル: AnimalNameID (PK)、LanguageID (FK)、名前

クエリは次のようになります。

SELECT * FROM Animal a JOIN AnimalName an ON an.AnimalNameID = a.AnimalNameID and an.LanguageID = ? WHERE a.AnimalID = ?

2 番目の方法として、"AnimalID" FK 列を AnimalName テーブルに追加すると、最初の方法で表現されたクエリもサポートされます。

上記の方法のうち、最速のパフォーマンスを提供するのはどれですか (これは非常に重要です!)? 上記の方法のうち、あなたの経験から一般的に推奨するものはどれですか?

答えてくれたすべての人に前もって感謝します!

4

3 に答える 3

4

最初の方法だけが、あなたが説明した問題を正しくモデル化します。動物には、言語ごとに1つずつ、多くの名前があります動物の線に沿って何かをモデル化する2番目の方法は、言語fooにある1つの名前を持っています。これは、問題の説明とはまったく異なるものです。

説明したこの種のクエリでは、AnimalNamesテーブルは、によって一意にクラスター化さ(AnimalId, LanguageId)れ、非クラスター化制約として主キーを持っている必要があります。または、AnimalLanguageIDPKを完全に破棄して、の複合PKをモデル化する必要があり(AnimalID, LanguageID)ます。

また、インデックスの設計も読む必要があります

于 2012-05-27T08:50:36.823 に答える
2

最初の方法では、AnimalsとAnimalNameの間に標準の1対多の関係が与えられ、各動物に多くの名前を付けることができます。これは理にかなっています。

2番目の方法では、各動物に1つの名前が付けられ、1つの名前を多くの動物に割り当てることができますが、これは意味がありません。

于 2012-05-27T05:24:40.253 に答える
1

2番目のアプローチの方が優れています。AnimalNameとAnimalは、1対多の関係になります。これは、ここでより適切に理解できます。

于 2012-05-27T05:19:44.940 に答える