質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

2回答

2004閲覧

RailsでのDB設計について

vc3000

総合スコア196

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2017/07/01 22:40

以下のように、会社、部署、社員のテーブルがあるとします。
これは例として作ったものでして、複数部署兼務などは考えないものとします。

companies id PK departments id PK company_id employees id PK company_id department_id

社員の所属会社を調べるとき、employees.department_idがあればemployees.company_idがなくても所属会社は一意に決まります。

しかしemployees.company_idをなくすと、会社に所属する全社員を取得するとき、全部署を取得してから各部署の所属社員を取得するか、includesなどを使ってJOINしてから絞り込みをすることになると思います。

なので、気分的には引っかかるものの、company_idとdepartment_id両方持たせる上記の設計にしたくなるのですが、これは普通でしょうか?

今回は推移関係が2段階だけでしたが、これが何段階にもなった場合はどうでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

DB設計の話でいけば、Orlofsky様のおっしゃる通りなのですが。
Railsは少し話が違います。

質問として、いまいちだったと思うのは

会社と部署という、包含関係はありそうだけれど全く違う構造になりそうなmodelを例に出し
包含関係がさらに追加された場合と言われてもOrlofsky様の回答しか引き出されないと思います。

Railsは基本的にtable(イコール)modelという概念で最適化されています。
これでなかなかの規模まで、なんとかなります。
また、Railsはしっかりとレールに乗った構築をしていれば
テーブルの構造に変更があっても、Railsの変更は最小限で済みます。
なので、設計はベターで行って、運用しながらベストを探る(案ずるより生むが易し)がRailsの基本となります。

というのを前提にして
もしその親子関係があるモデルというのが大グループ中グループ小グループみたいな感じでmodel(class)としての
機能がほぼ同じで、さらに細目グループが追加される可能性や小グループと中グループが入れ替わったり
中グループが消え小グループが大グループ直下になるとかいうことが起こり得るモデルなら
ancestryなるgem
をお勧めします。これはSQLアンチパターンを利用して包含関係を、activerecordに組み込んであるので
非常に使いやすいです。

投稿2017/07/04 05:27

編集2017/07/04 07:41
moke

総合スコア2241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どんなシステムでしょうか?

会社テーブルはともかく、部署は会社によってまったく異なるでしょうからテーブルにするでしょうか?必要なら部署名をそのまま社員テーブル?(顧客テーブル)に持つのでは?

システムの用途などは説明された方が良いです。

投稿2017/07/02 22:25

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vc3000

2017/07/03 11:02

実際に作りたいのは会社、部署のDBではないのです。この構造にだけ着目していただきたいです。 要は employees.department_idがあればemployees.company_idがなくても所属会社は一意に決まります。 のような冗長性がある設計を許容するのはよくあることか?とお聞きしたかったのです。 システムの詳細が分からないと回答できなければ、一般論、理論的な説明だけでも良いです。 不勉強で知らないのですが、このような冗長性に呼び方はあるのでしょうか?あるいは、この冗長性を消去することを○○正規化と呼ぶ、とか。
Orlofsky

2017/07/04 01:19

質問でも回答でも理解され易い文章を書くのはハードルが高いです。 通常第3正規化まで行います。ミッションクリティカルなシステムだったり、DWHのような大量なデータを扱う場合は、将来のことも考慮して >employees.department_idがあればemployees.company_idがなくても所属会社は一意 なら正規化を崩してdepartmentsにcompany_nameを持たせる事でcompany_idを削ることも考えられます。ですが、その効果が微々たるものだったり、データ増減に伴うcompany_nameの設定がきちんとできなければ正規化をきちんと守ります。 複合キーを減らしたいのであればサロゲートキーを使う場合もあります。 https://www.google.co.jp/?gws_rd=ssl#q=%E3%82%B5%E3%83%AD%E3%82%B2%E3%83%BC%E3%83%88%E3%82%AD%E3%83%BC
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問