_all_info
_というテーブルがあり、ユーザーIDを保持しています。このテーブルのid
は、2つのタイプ(1つだけまたは別のタイプ、決して両方ではない)にすることができます。たとえば、int
とvarchar
ですが、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) |
+--------------------+ +--------------------+ +-------------------------+ +-------------------------+
_
重要なのは、それが最善のアプローチですか、それとも計画を変更する必要がありますか?
たとえば:
他の情報をユーザーのIDとして選択します。ここで、すべてが同じタイプになり、ユーザーのすべての特定の情報をそのホールテーブルに追加しますか?
null
列が作成されます。2つのタイプのユーザー用に2つの完全に異なるテーブルを作成しますか?
また、こことSOでsuper type/subtype
を検索します。
allユーザーが両方のタイプのIDを持っている場合、id2
を主キーにし、unique not null
のid1
インデックスを作成できます(両方のタイプのIDが持っていると仮定します)ユニークであること)。このスキームで外部キーとして使用できるのはid2
のみですが、単純な結合でいつでもid1
を取得できます。
すべてのユーザーが両方のタイプのIDを持っているわけではない場合は、twounique
(ただしnull許容)インデックスを作成し、3番目の列を主キー(id3 integer identity primary key
など)として追加できます。適しているかもしれません)。次に、他のテーブルのid3
を外部キーとして使用します。