RailsにてベンチャーでBtoCの自社サービス開発をしている初心者です。
前提として、まだ割と小さなアプリケーションです。
対象のテーブルに関して、モデル名は伏せますがシステムの中心となるデータのモデルです(Model
とします)。
これには住所のデータがあり、管理側で入力しユーザーに表示されます。モデルの性質上、住所はほぼ必須です。また住所は一つだけしか紐づけられえません。
他に登場するモデルは、都道府県と市区町村を表すPrefecture
とCity
があり、それぞれマスターテーブルとなっています。
さて、Modelの住所データの持たせ方として、今まではprefecture_id
city_id
といったカラムを直接作成し、マスターテーブルに対する外部キーとしていました。Model
と Prefecture
City
は一対一の関係です。
しかしながら、これらのカラムにはNOT NULL
の制約は課されていませんでした。なぜなら、Model
のデータをCSVから大量にインポートするのですが、CSVの都道府県や市区町村のデータでマスターとマッチしない文字列がある場合はNULLにするしかないからです。
先輩によると、これはよくない設計のため以下のようなリファクタリングをすると言われました。
それは、以下のような中間テーブルを作成し、prefecture_idとcity_idを切り出すということです。
モデル名 - カラム名 ModelPrefecture - model_id - prefecture_id ModelCity - model_id - city_id
associationは
Model has_one ModelPrefecture Model has_one ModelCity
のようになります。
これでNULLを排除できるというわけです。
私はNULL排除の意味もなんとなく知っていましたし、同じアプリケーション内でマスターデータに対して全く同じように設計されている箇所が他にも多くあります。
しかし、私の感覚としては、prefecture_id
city_id
は必須に近いデータなので、Model
のカラムとしてあるのが感覚的には自然でした。
また、ただprefecture_id
city_id
のデータがNULLになるという例外のためにこのような実装をしていると無駄に複雑性が増していくのではないかとも思いました。
住所の表示をするコードでdecoratorなどでprefectureやcityの存在確認をするということは変わりませんし、普通にアプリケーションを書けば致命的なエラーに繋がる部分でもないので、なんとなく腑に落ちない感じです。
私はこれ以外のプロジェクトをあまり見たことがないのでわかりませんが、ネットで検索するとNULL許容派の方もいらっしゃるようです。
このケースでは、
- 上のようなテーブル分割を行う
- テーブルは分けず、他の方法で解決する
のどちらが良いのでしょうか?
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/07 09:49
2017/12/07 09:53
2017/12/07 09:56