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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

1回答

910閲覧

テーブル設計での制約の表現方法

k-tokitoh

総合スコア15

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2020/02/19 01:16

編集2020/02/19 04:22

テーブル設計について質問させていただきます。
RDBMSはMySQL8.0です。
以下具体例をあげます。

以下のようなエンティティがあったとします。

(凡例)エンティティ名: フィールド1, フィールド2, ...

  • 求人: 求人id(PK), 勤務地, 給与, 職種id(FK)
  • 職種: 職種id(PK), 名称, 資格要否

以下のように関連付けしたとします。

求人 (0..n) - (1) 職種

しばらくして、職種ごとに異なる求人情報を保持したくなったとします。

求人を継承する以下のエンティティを用意することにしました。
(Railsアプリケーションから利用するため、継承はSTIにより実現し、テーブル数は増やさずに求人テーブルにtypeカラム+αを追加する予定です。)

  • エンジニア求人: エンジニア求人id(PK), 使用言語
  • 看護師求人: 看護師求人id(PK), 診療科
  • 教員求人: 教員求人id(PK), 校種

これでいったんは必要な情報を保持することができました。

問題

ここで以下の条件があったとします。
「"XXXX勤務条件"というtypeカラムの値は、名称: XXXXである職業レコードがに存在するときのみ存在できる」
ex1. 「名称: エンジニア」である職業レコードが存在するので、「エンジニア勤務条件」は存在できる
ex2. 「名称: 営業」である職業レコードが存在しないので、「営業勤務条件」は存在できない

この制約は(アプリケーションレベルではなく)RDBレベルにおいて表現可能でしょうか? 可能である場合、どのような方法があるでしょうか?
あるいは、そもそも上記の議論に不適切なところがあるでしょうか?

ご教示のほどよろしくお願いします????

[追記]
「求人テーブルのtypeカラムにenum制約を設け、職種テーブルのinsertをトリガーにしてenumで許容する値を追加する」という方法が思いつきました。
アイデアレベルであり、実現可能かが見極められていないので引き続き回答を募集させていただきます。

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

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

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

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

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

momon-ga

2020/02/19 01:34

使用するRDB(DBMS)は何か追記してください 正直聞いたことない制約ですが、DBMSによってはできるかもしれんけど、それがわからないことには。。。
Orlofsky

2020/02/19 03:21

[MySQL]タグを追加しては?
guest

回答1

0

殆どのRDBMSは独自の制約を追加できます。

以下参考。
MySQL 8.0.16にCHECK制約が来て、NOT ENFORCEDなんてものまでついてきた

投稿2020/02/19 01:36

編集2020/02/19 08:52
sazi

総合スコア25300

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

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

k-tokitoh

2020/02/19 10:10

check制約で検討してみます!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問