問題
多対多の関連を作るときの交差テーブル(中間テーブル、関連テーブルなどとも呼ばれる)にどのような名前をつけていますか?
2つのテーブル名を単純につなげた users_magazines のような命名を見かけますが、これはあまり良い名前ではありません。
実体 (entity) は名詞に対応すると考えることができる。例えば、コンピュータ、従業員、楽曲、数学的定理といった名詞である。
関連 (relationship) は2つの実体間の関係を捉えたものである。関連は2つ以上の名詞句を結び付ける動詞に対応すると考えることができる。例えば、企業とコンピュータの間の「所有する」(owns) という関連、従業員と部門の間の「監督する」(supervises) という関連、アーティストと楽曲の間の「演奏する」(performs) という関連、数学者と定理の間の「証明した」(proved) という関連などである。
交差テーブルは関連(relationship)から生まれているものなので、関連の意味を表す命名をしましょう。
考え方
AとBというテーブルの交差テーブルの場合
A [動詞] B (AがBを○○する、した、している)
人 [動詞] A B (AにBを○○する、した、している)
となる動詞を考える。その動詞を「○○すること」と名詞の形に変えたものが必要な名前。これをCとする。
動詞の名詞形は、辞書を引くこと。動詞語尾を変えた形よりも適切な単語がある場合もある。動詞と同形の場合もある。
動詞がBとほぼ同じ単語になる場合は「付与・取得」の意味の動詞を使うのがよいかもしれない。
見つからない場合は動名詞(-ing)を使うが、その動詞が「イベントとして数えられるか」「業務上ログや記録として扱えるか」を基準にする。
状態動詞(like, know, haveなど)は動名詞化せず、別の単語を探す。preparednessのような過去分詞+nessの形もわずかにある。辞書に載っていれば使える。
Cが決まったら、ABCと連結した名前を作り、冗長なものや明らかなものを削る。
例1:userとmagazineの場合
userがmagazineを購読する
購読する=subscribe
subscribeの名詞形はsubscription
連結してuser_magazine_subscription
このDBの中でsubscriptionがuserとmagazineの関係であることが明らかなら、userとmagazineを省略しsubscriptionとする。
例2:userとqualification(資格)の場合
userがqualificationを得る
資格を得る=qualify
qualifyの名詞形はqualificationだが同じ単語になってしまう
動名詞にしてqualifying、もしくは「得る」の単語を探してacquire→名詞形はacquisition
連結してuser_qualification_acquisition
単数形にするか複数形にするかは別途規約で定めましょう。
ちなみに複数形を採用する場合、Cは抽象的な名詞や動名詞なので不可算名詞になることがありますが、気にせず複数形にするのがよいと思います。なぜなら「レコード」や「行」は数えられるものだからです。(“Two coffees”と言えるのと同じ理由)
名前の例
- subscription (user <=> magazine)
- membership, affiliation (user <=> group)
- friendship, connection (user <=> user)
- authorship (user <=> article)
- tagging (thing <=> tag)
- categorization, classification (thing <=> category)
- enrollment (user <=> course)
- ownership, possession (user <=> item)
- assignment (user <=> task, role)
- employment (employee <=> company)
- participation, attendance (user <=> event)
- course_offering (school <=> course)
- qualification_acquisition, qualification_grant (user <=> qualification)
- permission_grant, access_grant (user <=> permission)
- like, favorite (user <=> object)
自己結合の場合のそれぞれの呼び方
- source, target
- origin, destination
- follower, followee
- object, subject
もっと例を集めて共有すれば、それだけでかなりの部分で適切な命名ができるようになるはず!