DBのテーブル名は単数形にすべき
はじめに
テーブル設計をするときに必ず悩むのが、テーブル名を単数形にすべきか複数形にすべきかという問題。
特にここには明確な答えはありませんし様々な議論がなされています。
もし既に開発チームやコンポーネントの方針としてどちらかに統一されているのであればそれに従って作るというのが最善ではあるものの、
もし個人開発などで1から作ろうってなった場合には、自分はテーブル名は基本単数形を使うようにしています。
今回はテーブル名を単数形にすることのメリットを色々まとめてみました。
テーブルは複数のレコードが集まって出来ている
テーブル名に単数形・複数形の正解はないものの、一般的にはテーブル名は複数形にしたほうが良いという風潮があります。
その理由としてよく聞くのが、「テーブルは複数のレコードが集まって出来ているものだから」という理屈です。
例えばユーザー情報を入れるテーブルを考えます。
1つのテーブルに複数のUserの情報が入っているのでテーブルの名前としてはUsersが適切という考え方です。
個人的には別にUserが複数集まっているテーブルをUserテーブルと呼んでしまっても良いのではないかと思います。
テーブルの中に1レコードしか入っていないという状態は稀であり、基本的には複数レコード入っているものなので、中に複数レコード入っているからテーブル名が複数形でなければいけないと考える必要はないと考えています。
複数形への変換の難しさ
テーブル名を複数形で命名する場合、英語ネイティブではない人にとってはここでひと手間かかります。
英単語の基本形として、ほとんどは語尾に「s」をつければいいのですが
「子音 + -y」ならyをiに変えてesをつけるなどルールが厄介な場合があります。
またさらに独自で複数形を持っている単語などもあり、personはpeopleになったり
dataはdataのままだったりと一つ一つ辞書を引いて調べたりするといった手間が発生します。
こういった英語が流暢でない人の場合は単数形運用の方が発音もしやすく、複数形に変換する手間が無くなるのでこれは一つの大きなメリットではないかなと考えています。
SQLクエリがわかりやすくなる
以下のような注文商品(order_item)テーブルを考えたときに単数形と複数形だとどのようなクエリになるかを考えてみましょう。
複数形の場合
SELECT
order_items.name,
order_items.price
FROM
order_items
WHERE
order_items.id = 'xxxx';
複数形のテーブル名の場合だと、SELECT文のカラム名を指定している場合にorder_items.name のように1つのレコードの名前を取りたいだけなのに、複数形になってしまっているのには違和感があります。
単数形の場合
SELECT
order_item.name,
order_item.price
FROM
order_item
WHERE
order_item.id = 'xxxx';
このように単数形で表すことで、order_item.name のように違和感がなくなります。
複数形にすべきケース
自分は原則テーブル名は単数形推しではありますが、
使っているフレームワークの方針で複数形が推奨されているのであればそちらに従ったほうが良いと考えています。
一番メジャーなのはRuby on RailsのORマッパーあたりでしょうか。
もちろん設定次第では単数形とすることもできますが、フレームワークで方針が決まっているのであればそれに合わせた方が良いと考えています。
今後フレームワークのメジャーアップデートがあった際にその部分を保守しなければいけない可能性も減りますし、チームで開発する場合に他のメンバーの認識として複数形で運用されていると思っていることが多いはずなのでこれらにわざわざ抗ってまで単数形での運用を押し通す必要はありません。
まとめ
現時点で、自分の中ではテーブルは単数形にするのが最適であると思っています。
ただしチームで開発する時は既にあるルールに従ったりチーム内でしっかり相談することが必要で、そのうえで単数形・複数形どちらにするのかを統一する事の方がよっぽど大事です。
これを読んで下さったあなたも、こういった設計時の細かい部分の最適解を自分なりに考えてみてください!