56277


groupsテーブルとusersテーブルがあったとします。

groupsテーブルのカラムが、  
・ id  
・ group_id  
・ name

idがuuid、group_idがユーザーが見ることができるidになっています。

usersテーブルのカラムが  
・ id  
・ user_id  
・ group_id  
・ name

idがuuid、user_idがユーザーが見ることができるid、group_idがgroupsのidに紐づいています。

この場合、usersのgroup_idがgroup_idではなくidに紐づいているので、  
とてもややこしいと感じます。

こういった場合はどのように名前をつけるべきでしょうか。


CC BY-SA 4.0
2019-06-29T22:36:50.693
56235
2019-07-01T08:07:51.103
29047
question
mysql sql oracle
sqlのカラムの命名規則について


「異なる意味なのに同じ名前」がややこしさの原因なので、「異なる意味なら異なる名前」になるようにするようにすればよいわけですが、これをどうするかはアプリケーション全体を見ないと決められない話です。

* * *

groupsのgroup_idの名前を変えるのが自明で短絡的な方法ですが、group_idが真にIDなのであればリレーションをそっちに張るとか、それならidいらないのではとか、IDじゃないのであればgroup_idとは一体何者でそれにふさわしい名前は何かとか、別の視点でgroup_idが既存の名前付けルールにより決まる名前なのであればそのルール自体見直さないといけないのでは、とか、質問の内容だけでは考えようがないですし、考えられるための材料を質問に記載するのは難しいでしょう。


CC BY-SA 4.0
2019-06-30T10:15:41.070
56259
2019-07-01T07:47:46.260
2019-07-01T07:47:46.260
5793
5793
56235
answer


ツールの制約もあるでしょうが、主キーは何を表すものかが分かるように修飾することをすすめます。

「ユーザーが見ることができる ID」は、name と同じくリレーションシップに意味のない文字列と受取りました。この名前を工夫すれば理解しやすくなるでしょう。

たとえば、下記のように変更してはどうでしょうか。

[code]

    groups
    - group_id (←id)
    - id_friendly (←group_id)
    - name
    
    users
    - user_id (←id)
    - group_id
    - id_friendly (←user_id)
    - name
    
[/code]


CC BY-SA 4.0
2019-07-01T03:03:43.687
56277
2019-07-01T03:03:43.687
8431
56235
answer


まず、ややこしいと感じるかどうかは主観によるかな、と思います。

`users.group_id` が外部キーで、 `groups` のPKであるところの `id`
参照している、というのは私から見ると特に違和感はありません。  
むしろ次のような場合だと違和感があります:

  * `id`がPKでない
  * `groups.group_id`や`users.user_id`がPKである
  * `users.group_id`が、PKではない`groups.group_id`を参照している

* * *

主キーの意味で`id`という名前を使い、また他方でユニークな識別子(identifier)の意味でも`id`という名前を使っているのが違和感の根源かと思います。対応案としては:

  * `group_id` -> `group_name` などにリネームする 
    * `id`といえば普通PKのことだろ派。ORMフレームワークのデフォルトではそうなっているものも多いかと思います。
  * `id` -> `pk` などにリネームする 
    * PKなんだから`pk`で良いだろ派。現状通り`group_id`, `user_id`がユニークであることが名前から想起できます。

私の宗派は前者です。


CC BY-SA 4.0
2019-07-01T08:07:51.103
56288
2019-07-01T08:07:51.103
2808
56235
answer