web-dev-qa-db-ja.com

主キーが2つのタイプである可能性があるシナリオの設計

_all_info_というテーブルがあり、ユーザーIDを保持しています。このテーブルのidは、2つのタイプ(1つだけまたは別のタイプ、決して両方ではない)にすることができます。たとえば、intvarcharですが、1つです。テーブルに2つの主キーを含めることはできません。複合キーでは問題を解決できません

だから、私はこれを行うことはできません:

_+--------------------+
| all_info           |
+--------------------+
| PK id1 varchar(50) |
| PK id2 int         |
| ...                |
+--------------------+
_

次に、必要なタイプの主キーを使用して_unique_info1_と_unique_info2_の2つのテーブルを作成し、特定のタイプのユーザーの情報を追加して、テーブルとの関係を作成しました:_all_info_、残りのユーザー情報(両方のタイプが共有する)を保持します。

このスキームでは、_unique_info1_と_unique_info2_を他のすべてのテーブルと関連付けることができますが、その関係を確立するには、それぞれに2つの列を作成する必要があります。これを解決するために、私は_all_info_に人工的な主キーを作成して、すべての事後関係を作成しました。

今、それはこのように見えます:

Obs:FK uniq1_id varchar(50)FK uniq2_id int(10)は一意であり、null許容です。

_+--------------------+    +--------------------+    +-------------------------+    +-------------------------+
| unique_info1       |    | unique_info2       |    | all_info                |    | other_table             |
+--------------------+    +--------------------+    +-------------------------+    +-------------------------+
| PK id varchar(50)  |    | PK id int(10)      |    | PK id int(10)           |    | ...                     |
| ...                |    | ...                |    | ...                     |    | ...                     |
| ...                |    | ...                |    | FK uniq1_id varchar(50) |    | ...                     |
| ...                |    | ...                |    | FK uniq2_id int(10)     |    | FK all_id int(10)       |
+--------------------+    +--------------------+    +-------------------------+    +-------------------------+
_

重要なのは、それが最善のアプローチですか、それとも計画を変更する必要がありますか?

たとえば:

  1. 他の情報をユーザーのIDとして選択します。ここで、すべてが同じタイプになり、ユーザーのすべての特定の情報をそのホールテーブルに追加しますか?

    • これにより、ユーザーごとに多くのnull列が作成されます。
  2. 2つのタイプのユーザー用に2つの完全に異なるテーブルを作成しますか?

    • これにより、情報が冗長になります。
2
Rafael Barros

enter image description here


また、こことSOでsuper type/subtypeを検索します。

3
Damir Sudarevic

allユーザーが両方のタイプのIDを持っている場合、id2を主キーにし、unique not nullid1インデックスを作成できます(両方のタイプのIDが持っていると仮定します)ユニークであること)。このスキームで外部キーとして使用できるのはid2のみですが、単純な結合でいつでもid1を取得できます。

すべてのユーザーが両方のタイプのIDを持っているわけではない場合は、twounique(ただしnull許容)インデックスを作成し、3番目の列を主キー(id3 integer identity primary keyなど)として追加できます。適しているかもしれません)。次に、他のテーブルのid3を外部キーとして使用します。

1
david25272