1つのテーブルが他の2つのテーブルと関係があるが、その中のレコードは1つのテーブルとしか関係がないという奇妙な状況に遭遇しました。明確にするために、attribute
、visit
、visit_action
のテーブルがあります。 visit
はvisit_action
の親です。1回の訪問で、ユーザーは複数のアクションを実行できます。訪問とアクションの両方に、name
とvalue
で構成される属性があります。 1つのattribute
はvisit
またはvisit_action
のいずれかに関連付けることができますが、同時に両方に関連付けることはできません。 1回の訪問には複数の属性を含めることができ、アクションも同様です。これらの関係をデータベースに保持するにはどうすればよいですか?
オプション1visit_attribute
とvisit_action_attribute
のような2つの接続テーブルを作成します。どちらもattribute
との関係があり、1つは関係があります。 visit
に1つとvisit_action
に1つ。このソリューションで私が抱えている問題は、属性がvisit
とvisit_action
の両方に同時に結び付けられる可能性があることであり、それは望ましくありません。
オプション2id_visit
およびid_visit_action
を含む列をattribute
テーブルに直接作成します。 attribute
は多くの訪問やアクションに関連付けることができないため、適切に思えますが、1回の訪問と1つのアクションに同時に拘束される可能性があるという問題があります。 attribute
テーブルの1つの列が常にNULL
(id_visit
またはid_visit_action
のいずれか)になるのは残念です。
3番目のオプションがあります:
それぞれにname
列とvalue
列を含むテーブルvisit_attribute
とvisit_action_attribute
を作成します(そしてattribute
テーブルを完全に削除します)。
これにより、特定の属性がvisit
とvisit_action
の両方にリンクされる可能性がなくなり、NULL値のid列は必要ありません。