質問: テーブル設計 ------- | kawaii_user_id | not_kawaii_user_id | company_id | | --- | --- | --- | | ForeignKey-> UserTable | ForeignKey-> UserTable | ForeignKey-> companyTable | 上記のような、「あるUser」が「あるUser」を持つことが出来るテーブルがあります。 また、Userが属するCompanyテーブルがあります。 User間の関係を持てるのは同一Companyのみです。 今回のテーブルでは、userAが`kawaii_user_id`でUserBを`not_kawaii_user_id`としていても、userBが`kawaii_user_id`としてuserAを`not_kawaii_user_id`という状態を同時に持つことが可能ということを想定しています。 現状 --- 最初の設計として、このユーザ間の関係性を一意に保つために`kawaii_user`と`not_kawaii_user`を複合主キーとして設計しました。 しかし、最初に気付いたのは上記の複合主キーであると、属する会社に関係しない一意性になってしまいます。 (`CompanyA`でUserA→UserBの関係を持つと、`CompanyB`ではUserA→UserBの関係が持てない。) そのため、複合主キーを`kawaii_user_id`、`not_kawaii_user_id`、`company_id`の3つ設定すれば、回避出来ると考えたのですが、今度は > > 今回のテーブルでは、userAが`kawaii_user_id`でUserBを`not_kawaii_user_id`としていても、userBが`kawaii_user_id`としてuserAを`not_kawaii_user_id`という状態を同時に持つことが可能ということを想定しています。 > > > という、UserA→UserBとなっていてもUserB→UserAという関係を持てるという関係性を保つ事が厳しくなってしまいました。 こういった場合、どういう制約の掛け方をするのがベストでしょうか? よろしくお願いします。
回答: 用途がよくわかりませんが、「可愛い」か「可愛くない」かはキーではなくフラグ(kind or status)としてのカラムにするべきではないでしょうか? 質問のテーブル?とUserTable, companyTable でどんなSQLが必要になるのか、CREATE TABLE, CREATE INDEX を添えて質問に提示されては?