0

次のような構造の新しいデータベースに慣れようとしています。

CREATE TABLE [TableA] (ID int not null, Primary Key (ID))
CREATE TABLE [TableB] (ID int not null, Primary Key (ID))
CREATE TABLE [TableC] (ID int not null, ID2 int, ID3 int, ID4 int, primary key (ID),
FOREIGN KEY (ID2) REFERENCES TableA(ID), FOREIGN KEY (ID3) REFERENCES TableB(ID))

テーブル C は、テーブル A とテーブル B の間の多対多のジャンクション テーブルです。TableC.ID は一意です (主キーであるため)。TableC.ID4 も一意であり、何も参照していないようです。「M1(多対1)エンティティの非正規化」と説明した開発者に連絡しました。非正規化 (データベースを正規化し、パフォーマンス上の理由から意図的に異常を導入すること) の目的を完全に理解していますが、この背後にある理由はまだ理解していません。私が気付いていないパターンや概念はありますか? アプリケーションは C++ で書かれており、VB.NET が少し含まれています。

4

2 に答える 2

0

tableC.ID4に、通常は追加の結合またはルックアップを実行する必要がある値が含まれている場合は、かなり非正規化されます。では、アプリケーションコードをチェックして、その列に何が入力されているかを確認しましたか?何も参照しておらず、行データ全体を強化していない場合は、安全に開発を進めることができます。

于 2012-08-29T05:15:14.960 に答える
0

これはそれ自体が答えではなく、関連する考えです。投票を開始しないでください。

tableC.ID と tableC.ID4 の間に何らかのリンクはありますか? 私のプロジェクトの 1 つで、同様のケースがありました。ユーザー テーブルにユーザー ID とユーザー名がありました。両方とも、ユーザー ID を主キーとして一意でした。そのテーブルからユーザー名を削除し、ユーザー ID をユーザー名にマッピングする別のテーブルを作成する 1 つの方法があります。私はノーマライゼーションの大ファンではありません。そのため、ユーザー名を含むユーザー テーブルからのデータが必要になるたびに結合クエリを起動するのはオーバーヘッドであると考え、設計をそのままにしました。

于 2012-08-29T05:31:25.967 に答える