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

1つのテーブルに複数の主キーが存在できますか?

    • キーとは何ですか?
      • シンプルなキー
      • 連結キーまたは複合キー
      • 主キー
        • 数値化と自動インクリメント
    • テーブルに複数の主キーを含めることはできますか?

    多くの開発者やデータベース管理者は主キーを使用する場合があります 毎日、「正確には 」と自問するのは魅力的なトピックです。 主キー また、データベーステーブルに複数の主キーを含めることができます(または含める必要があります)。 同時に?」

    以下では、これらの質問をより詳細に検討し、開発コミュニティ内で合理的で一般的に合意されたコンセンサスに到達しようとします。

    キーとは何ですか?

    主キーが何であるかを理解する がデータベーステーブルにある場合、最初に非主キーについて少し理解する必要があります 。 キー テーブル内は、その情報を識別してアクセスするために使用される単なる属性です。テーブルには、テーブル Users のように、複数のキーが含まれる場合があります。 両方のメール およびusername キーと見なすことができます。

    話している開発者または管理者によっては、さまざまなキータイプとその定義について耳にすることがあるため、以下にいくつかの異なる例とそれぞれの基本的な定義について説明します。

    シンプルキー

    シンプルキー テーブル内の単一の属性のみを使用するキーです。キーまたはテーブルにさらに制限を課さない限り、 username 上記の例の属性は単純なキーです 。

    連結キーまたは複合キー

    シンプルキーからさらに一歩進んだ 連結 またはcompound キー。名前が示すように、連結キー 複数の単一のキーの結合です 。たとえば、システムは自動的に last_nameを結合する場合があります およびyear_of_birth シングルキー 連結キーに 、そのように: smith1980

    主キー

    [主キー](https://en.wikipedia.org/wiki/Unique_key) は、プリンシパル(またはプライマリ)として選択されたキーです。 )そのデータ行の代表的な属性。 主キー ユニーク そして、その属性はデータベース全体で使用され、問題のデータの代表的な属性としてアクセスされ、他のテーブルに渡されます。

    実際には、主キー 属性もNOTNULLとしてマークされます ほとんどのデータベースでは、これは、テーブルに挿入されるレコードの値が属性に常に含まれている必要があることを意味します。

    例として、 email またはusername シンプルキー できた 主キーの指定が割り当てられます 、ただし通常は、主キーを設定することをお勧めします ビジネスロジックまたは個人によっても変更されない(または変更できなかった)属性に変更します。たとえば、 Userを想像してみてください 新しいメールアドレスを取得すると、過去のすべての主キーが発生します 古いメールアドレスを使用して作成された関連付けは、新しいメールアドレスを使用すると無効になります。

    このため(とりわけ)、ほとんどの主キー [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)などの数値または一意の文字列を使用します 。

    数え上げと自動インクリメント

    また、多くのデータベースシステムは、すべてのテーブルに主キーが含まれるように設定されていることにも注意してください。 これは数値であり、自動インクリメントされます。これは単に、データベースエンジン自体が、そのテーブル内の新しい各レコードに一意の主キーを自動的に割り当てることを意味します。 以前のすべての値よりも段階的に大きい値。ただし、ほとんどの開発者は、この方法が時代遅れであり、一部に使用すると、システムに不要なセキュリティ上の欠陥が生じることに同意しています。 特定のデータを表すテーブル。

    たとえば、すべての Userを想像してみてください レコードには、自動インクリメントされた主キーが割り当てられます 値、 idとして知られています 属性。悪意のある人がidを発見した場合 特定のユーザー(例:John Smith)の属性は、値 1500です。 、これはすでに少しの情報を公開しています。まず、システムには少なくとも1499人の他のユーザーがいる可能性が高いか、ある時点で存在していたことを示しています。また、John Smithのユーザーページに、その idを含むURLまたはAPI呼び出しを介してアクセスできる場合も意味します。 1500の値 、その後、値を 1499などの別の数値に変更するだけの可能性があります。 または1501 、この訪問者が自分のページにアクセスすることを望まない可能性のある別のユーザーのページを公開します。このように、レコードは単に推測することでクエリできます。 id 質量スケールの値。

    これらは明らかに非常に単純な例ですが、これらの理由から、ほとんどの最新のデータベースはランダム化された一意の主キーを使用します。 UUIDなどの属性値 機密データを扱う場合。

    テーブルに複数の主キーを含めることはできますか?

    簡単な答えはいいえです 、テーブルに複数の主キーを含めることはできません 、リレーショナルデータベース設計の基本原則に反するため( [データベースの正規化](https://en.wikipedia.org/wiki/Database_normalisation)を参照) および[第3正規形](https://en.wikipedia.org/wiki/Third_normal_form)

    テーブルに複数の候補キーを含めることができます 、主キーと同様に効果的に動作します その中で候補キー 一意、 NOT NULL 、およびはそのテーブルレコードの特異な表現です。

    ただし、どの1つを選択するかについては 属性は主キーとして割り当てられます テーブルの場合、選択はすべての潜在的な候補キーのリストから行われます。 (そのため、名前は主キーになるための候補です。 )。最終的に、候補キーは1つだけです。 このテーブルで主キーとして使用される、そのレコードの最も代表的な属性として選択されます それぞれの外部キーを介して他のテーブルによってデータベースの他の場所で参照されます 。


    1. CentOS5でMySQLリレーショナルデータベースを使用する

    2. SQL Serverのdatetime2とsmalldatetime:違いは何ですか?

    3. SQLite JSON_INSERT()

    4. 軽量のWordPressインストール:SQLiteでWordPressをインストールする方法