sql >> データベース >  >> RDS >> Mysql

MYSQLでの正規化

    ここでは、正規化を素人の言葉で説明しようとしています。まず、リレーショナルデータベース(Oracle、Access、MySQL)に適用されるものなので、MySQLだけではありません。

    正規化とは、各テーブルに最小限のフィールドのみがあることを確認し、依存関係を取り除くことです。従業員の記録があり、各従業員が部門に属しているとします。部門を従業員の他のデータと一緒にフィールドとして保存すると、問題が発生します。部門が削除されるとどうなりますか?すべての部門フィールドを更新する必要があり、エラーが発生する可能性があります。また、一部の従業員に部門がない場合はどうなりますか(新しく割り当てられた可能性がありますか?)。これでnull値になります。

    したがって、正規化とは、簡単に言うと、nullになるフィールドを避け、テーブル内のすべてのフィールドが記述されているデータの1つのドメインにのみ属するようにすることです。たとえば、employeeテーブルでは、フィールドはid、name、social security numberである可能性がありますが、これら3つのフィールドは部門とは関係ありません。従業員IDのみが、従業員が属する部門を示します。つまり、これは、従業員が所属する部門を別のテーブルに配置する必要があることを意味します。

    これが簡単な正規化プロセスです。

    EMPLOYEE ( < employee_id >, name, social_security, department_name)
    

    説明したように、これは正規化されていません。正規化された形式は次のようになります

    EMPLOYEE ( < employee_id >, name, social_security)
    

    ここで、Employeeテーブルは1セットのデータのみを担当します。では、従業員が所属する部門をどこに保存するのでしょうか。別の表で

    EMPLOYEE_DEPARTMENT ( < employee_id >, department_name )
    

    これは最適ではありません。部門名が変更された場合はどうなりますか? (それは常に米国政府で起こります)。したがって、これを行う方が良いです

    EMPLOYEE_DEPARTMENT ( < employee_id >, department_id )
    DEPARTMENT ( < department_id >, department_name )
    

    第1正規形、第2正規形、第3正規形があります。しかし、DBコースを勉強しているのでない限り、私は通常、理解できる最も正規化された形式を選択します。

    これがお役に立てば幸いです。



    1. postgres列Xは存在しません

    2. 複数の列を持つ単一の固定テーブルと柔軟な抽象テーブル

    3. PostgreSQLでのScale()関数のしくみ

    4. FROM_UNIXTIME()の例– MySQL