前提・実現したいこと
現在、企業の発注履歴(どういうものを購入したか)を管理するデータベースをPostgreSQLで作成しております。
発注情報として、「商品」「発注先」「(その発注先における)担当者」があります(実際はもっと項目は多いですが)。
次のイメージです。
発注ID | 商品 | 発注先 | 担当者 |
---|---|---|---|
1 | ペン | 文具屋 | 鈴木 |
2 | 枕 | 寝具屋 | 佐藤 |
3 | マウス | 電気屋 | |
4 | 鉛筆 | 文具屋 | 佐藤 |
5 | 消しゴム | 文具屋 | |
6 | ペン | なんでも屋 |
注文2の担当者である「寝具屋の佐藤」と、注文4の担当者である「文具屋の佐藤」は、名前が同じだけの別人です。また、担当者は空欄(不明)であることもあります(実際は、半分以上が空欄です)。
そこで、次のようにテーブルを作成しました。
商品テーブル↓
id | 名前 |
---|---|
1 | ペン |
2 | 枕 |
3 | マウス |
4 | 鉛筆 |
5 | 消しゴム |
発注先テーブル↓
id | 名前 |
---|---|
1 | 文具屋 |
2 | 寝具屋 |
3 | 電気屋 |
4 | なんでも屋 |
担当者テーブル↓
id | 所属(発注先) | 名前 |
---|---|---|
1 | 1 | 鈴木 |
2 | 1 | 佐藤 |
3 | 2 | 佐藤 |
発注テーブル↓
発注ID | 商品 | 発注先 | 担当者 |
---|---|---|---|
1 | 1 | 1 | 1 |
2 | 2 | 2 | 3 |
3 | 3 | 3 | 0 |
4 | 4 | 1 | 2 |
5 | 5 | 1 | 0 |
6 | 1 | 4 | 0 |
これらを結合すれば、冒頭の表を表現することができます。
発生している問題
問題としては、発注テーブルに、「発注先2、担当者1」といった、存在しない「発注先と担当者の組」を入力できてしまうことです。プログラム側ではもちろんチェックをしますが、データベース側でも制約を設けたいです。そもそもデータが冗長になっているので、うまい設計方法や、そのためのヒントをご教示いただけると幸いです。
調べたこと
CHECK制約→制約の中で他のテーブルを参照する方法がわからず断念
外部キー制約→複数の列に対して設定する方法がわからず断念
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/28 07:30
2019/02/28 07:32
2019/02/28 07:39 編集
2019/03/01 01:01
2019/03/02 05:46
2019/03/02 06:52 編集
2019/03/02 06:42