質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

1500閲覧

リレーションが1対1(optional)の場合、外部キーにnullを許容すればよいか

nzap

総合スコア8

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

1グッド

0クリップ

投稿2021/07/18 07:51

編集2021/07/18 08:14

要件

社員テーブルと部署テーブルがある時、以下2つのデータのどちらも持てるようにしたい。

  • 1人の社員が1つの部署に所属している状態を表すデータ(1対1)
  • 1人の社員がどの部署にも所属していない状態を表すデータ(1対0)

設計

以下のテーブル設計は、上記要件を満たす設計として正しいでしょうか?
また、他に要件を満たす良い設計方法はありますでしょうか?

  • 社員テーブルに部署テーブルへの外部キーを設定する
  • その外部キーはnullを許容するようにする
環境

DB:postgres12
FW: Laravel8.0

mpyw👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2021/07/18 07:57

あなたの考える「正しい」の定義を質問文に書いてください。
guest

回答2

0

ベストアンサー

要件的に単一部署を保証したいのであれば NULL 許容された外部キーで

  • 「Employee (may) belongsTo Department」
  • 「Department hasMany Employee」

と表現すべきであるし,逆に複数部署になるかもしれない可能性をカバーしたいのであれば中間テーブルを使って

  • 「Employee belongsToMany Department」
  • 「Department belongsToMany Employee」

が妥当かと。盛んにメンテはされてないですが 
MEGApixel23/belongs-to-one みたいなパッケージもあるので,中間テーブルを使いつつ

  • 「Employee (may) belongsToOne Department」
  • 「Department belongsToMany Employee」

と表現することも可能です。

(もし最新版の Laravel で採用する場合 composer.json や .travis.yml を更新する PR を出してみてはいかがでしょうか)

投稿2021/07/20 00:54

編集2021/07/20 00:55
mpyw

総合スコア5223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nzap

2021/08/06 21:32

パッケージを使うことは考えていませんでしたが、検討してみます。 ありがとうございました。
guest

0

他に要件を満たす良い設計方法はありますでしょうか?

所属テーブルでそれぞれに外部キーを設定

投稿2021/07/18 09:48

sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問