0

データベースに同じ FK を含むテーブルがある場合、それらを正規化する必要がありますか?

問題の db テーブルは次のとおりです。

user (
    user_id int PK, 
    ...
    ...
)

user_cat (
    user_cat_id int PK,
    user_id int FK,
    effective_date date,
    location_id FK,          <-- dup
    qualification_id FK,     <-- dup
    business_id FK           <-- dup
)

user_admin_cat (
    admin_cat_id int PK,
    user_id int FK,
    effective_date date,
    company_id FK,
    location_id FK,          <-- dup
    qualification_id FK,     <-- dup
    business_id FK           <-- dup
)

重複を最小限に抑えるために私が考えたことは次のとおりです。

user (
    user_id int PK, 
    ...
    ...
)

user_cat (
    user_cat_id int PK,
    user_id int FK,
    effective_date date,
    shared_id, FK            <-- dup
)

user_admin_cat (
    admin_cat_id int PK,
    user_id int FK,
    effective_date date,
    company_id FK,
    shared_id, FK            <-- dup
)

shared_user_cat_fks (
    shared_id int PK,
    location_id FK,
    qualification_id FK,
    business_id FK
)

私が知りたいのは、次の質問の 1 つ以上に対する答えです。

(1) 正規化ソリューションを使用する場合、なぜそれが優れているのですか?
(2) 正規化ソリューションを使用しないとしたら、どうしますか? このソリューションが優れているのはなぜですか?
(3) 重複が 2 つのテーブルにしかないため、正規化ソリューションを使用しない場合、何かを行う前に重複のテーブルがいくつある必要がありますか? どのようなソリューションを実装しますか? なぜこれが良い解決策なのですか?

4

2 に答える 2

3

あなたが説明していることから、私はそれを「正規化」する理由がわかりません。これは正規化とは何の関係もないとさえ言えます。

正規化の個人的な簡単なルールは次のとおりです。単一のファクトの変更時に、複数の挿入/更新/削除を実行する必要がありますか。

または、私が表現できない事実の組み合わせがありますか。

または、2つの異なる方法で表現できる事実はありますか?

ここではわかりません。

したがって、2に対する私の答えは次のとおりです。問題がないため、何もありません。

ただし、隠れた非正規化がある可能性があります。しかし、それはあなたが説明するものではありません。

于 2012-04-23T19:19:38.600 に答える
0

1) 正規化されたスキームは、よりクリーンな設計で、保守が容易です。

2) 正規化されていないレイアウトの方が有効性が高い場合があります。たとえば、小さなテーブルへのクエリが多くuser_cat、巨大なテーブルへのクエリがほとんどなくuser_admin_cat、誰も UNION を必要としない場合、それは効果的かもしれません。

于 2012-04-23T19:10:55.123 に答える