
【18】【Rails】外部キー制約、ユニークキー制約、NOT NULL制約をどうする?
この記事を読むと、外部キー制約、ユニークキー制約、NOT NULL制約について理解が深まります。
Railsでマイグレーションファイルを編集する際、外部キー制約、ユニークキー制約、NOT NULL制約をどのようにつけていいかとても迷います。
この記事で、外部キー制約、ユニークキー制約、NOT NULL制約の付け方を学びました。
上記サイトは他の項目も詳しく書いてます。
『データベース設計には”これだ!”という正解はないと思っています。』
この言葉を頭の片隅におきつつ、データベース設計をやり方を学びたいと思います。
制約をつける
外部キー制約
外部キー制約は可能な限りつけるようにする。
『 DBが別れている場合、外部キーはもちろん貼れないのですが、そうでない場合はとにかく何も考えず貼っています。』
なるほど、極力つけるべきなんですね。
外部キー制約をrailsで表すと、
foreign_key: true
ユニークキー制約
ユニークキー制約も可能な限りつける。
ユニークキー制約をつけないとどうなるのか?
付けないことで起こり得るケースを見てみましょう。
注文(orders)テーブルと支払い(payments)テーブルがあって、注文に対する支払いは一つしか存在しないとします。
ユニーク制約がないと、注文に対して2回支払いが起きる不具合が発生します。
ユニークキー制約をrailsで表す、
unique: true
NOT NULL制約
NOT NULL制約もなるべくつけたほうがいい。
NOT NULL制約をつけないと、SQLが複雑になります。
事例
空のレコードを抽出する。
SELECT * FROM something WHERE note = "";
このSQLでいいんでしょうか?NULLが入っているかも知れませんよね。
SELECT * FROM something WHERE note IS NULL OR note = "";
NOT NULL制約がないと、このようにSQLが複雑になってしまいます。
ただし、なんでもかんでもNULLを削除すればいいわけではないので注意が必要です。
以下のようなケース
MySQLの0000-00-00 00:00:00は使ってはならない
まとめると
それぞれの制約はなるべく付けたほうがいい。
外部キー制約は何も考えずにつけていい。
ユニークキー制約も可能な限りつける。
NOT NULL制約もなるべく付けたほうがいい
しかし、なんでもかんでもNULLを削除すればいいわけではない。
参考文献
最後に
私がブログを書く目的は、素晴らしい本や、素晴らしい方々の技術記事を知って頂きたいからです。ぜひ、上記の参考文献を見て下さい。(noteなので広告とかは一切ありません。)
現在、株式会社grabssに行くために最後の悪あがきをしています!!
現在の進行状況
18件目投稿。目標まで後32件。
よろしければ、スキボタン及びサポートお願いします。勉強の励みになります。