1

次のデータベース スキーマを作成したフォーラム ページを作成しています。

Forum(questionId, postedByUserId, questionSubject, questionBody, TagIds);

Tags(tagId, tagName);

フォーラムのエントリは次のようになります。

(1, 1, 'sample subject', 'sample body', '1 4 2') ...

タグのサンプル エントリは次のようになります。

(1, 'C'), (2, 'C++'), (3, 'Java'), (4, 'Data Structure') ...

ここでの問題は、最初の正規形が、すべてのフィールドがアトミックである必要があることを示していることです。この場合、これは満たされていませんが、新しいテーブルを作成しているかのようにスペースが節約されるとforum_tag(questionId, tagId); 思います。概念的には正しいでしょう。

そのため、現在行っていることを行うか、正規化に従って列をアトミックにするかをどうすればよいかわかりません。

このような問題を見つけた場合が多いのですが、どうすればいいのかいつも曖昧なままなので、どちらが優れているのか、その理由を説明してください!

だから助けてください。

前もって感謝します :)

4

3 に答える 3

1

データベースのスペースは安価です。スペースによって異なる検索時間は、はるかに安くなります。ただし、検索時間は、キー付きアクセス戦略が機能するかどうかによっても影響を受ける可能性があり、クエリ オプティマイザーによって選択されます。その効果は劇的である可能性があります。

提案したスキーマで次の検索を検討してください: 関連するタグの 1 つが「4」であるすべてのフォーラム エントリを検索します。ほとんどの DBMS では、このクエリでは Forums テーブル全体を順次スキャンする必要があります。データ量によっては、これは数百万のディスク I/O になる可能性があります。

ジャンクションテーブルを考えてみましょう

ForumTags (ForumId, TagId) primary key (ForumId, TagId)

さらに、(ForumId, TagId) の自動インデックスに加えて、TagId にインデックスがあるとします。

同じクエリを実行すると、インデックスの 1 つで値 "4" のインデックス ルックアップが発生し、数十回のディスク I/O が必要になります。

正規化の目標の 1 つは、すべてのデータへのキー付きアクセスです。最初の正規形はその目標に従っています。

私は、最初の正規形またはより優れたスキーマを、リストが埋め込まれたスキーマと比較できる実際の状況に遭遇しました。これらの場合の速度の違いは、50 対 1 程度でした。

于 2011-05-17T15:27:26.513 に答える
1

私はあなたのフィールドをアトミ​​ックにすることに行きます。ほとんどの場合、1 つのフィールドに値をごちゃまぜにするフィールドがあり、後でレポートや分析のためにそのデータを絶えずこじ開けなければならないときに頭痛の種になります。タグの数を取得するのと同じくらい簡単なことをしたい場合はどうしますか? 非アトミック データのため、すばやく実行することさえできませんSELECT COUNT()。また、フォーラムの投稿を異なるタグで相互参照するクエリを作成する際にも大きな問題が発生します。「プログラミング」でタグ付けされたすべてのフォーラム投稿のクエリが必要だとしますか?

事前にデータをアトミックにすることで、後でクエリや分析を行う際の作業がはるかに簡単になります。このように言えば、データは DB に入る前に一般化された状態から始まりますが、常にそこから詳細が必要になります。詳細を簡単に把握できるように、データを個別のチャンクに保持するようにしてください。

于 2011-05-17T18:56:06.193 に答える
0

フォーラムとタグの関係を表す 3 番目のテーブルを作成する必要があります。

ForumTags(ftID、フォーラム、タグ)

このようにして、データベースが適切に正規化されるため、フォーラムへのタグの追加と削除がはるかに簡単になります。Walter Mitty が言うように、データベースで余分なスペースが必要になることを心配する必要はありません。原則として、明示的に証明されない限り、正規化は常に良い考えです。

于 2011-05-17T14:43:07.570 に答える