2012-03-16 6 views
0

私は現在のプロジェクトで多くを行う前にデータベース設計と正規化の大部分を理解しようとしています。残念ながら、私はデータベース設計に関する多くの経験がないので、かなり遅いプロセスです。私が把握しようとしている問題の1つは、あるテーブルが別のテーブルに関連付けられているかどうかを処理する最善の方法です。データベースのためのRailsの方法:person may_have(has_one?)account

私は、Rails 3.2を使用してレースを管理するWebアプリケーションを構築しています。人々はアカウント(/ユーザーアカウント)を作成し、レースをホストし、さまざまな側面を管理することができます。

1つのことは、特定のレースの参加者がユーザーであるかどうかです。実際、彼らの大半はユーザーではないと仮定することができます。しかし、参加している人には、自分のプロフィールにリンクすることができればいいです(そして、逆に、プロフィールから彼らが参加したレースへのリンク)。

匿名のコメントを投稿できるブログのようなものですが、ログインしてアカウントを使用するとさまざまな方法で投稿とリンクします。

私はしばらく検索しましたが、解決策は見つかりませんでした。 Participantsモデルに "has_one UserParticipation"というメモを付けることです。これは通常はゼロです。

これは有効な解決策ですか? これについてもっと良い方法がありますか? database_issue

質問2:これは少しそれほど重要では が、私は「ので、私は同じ質問でそれを尋ねるだろう考え出し

ここで私は簡潔に問題を示すために、ペイントで一緒に投げた小さな図ですすでに関連する質問を掲載しました。いくつかのことが参加者を参照します。「race.participants」を使用してコンペティティブ{Race_ID、Participant_Number}スーパーキーを設定する必要はありませんか? (私が知る限り、これらは非常によく似た働きをします。)

答えて

1

あなたは少し考えているかもしれません。私が正しくあなたを以下のいた場合、これは私がダイヤで手早く簡単なエンティティ関係図は次のとおりです。

simple erd

参加からユーザーのassoications上のいくつかの説明:

参加belongs_to :userの関連付けを持ちます。関連付けられたユーザーがない場合はnilです。

ユーザーは、has_many :participantsというアソシエーションを持ち、多くの参加者リレーションシップを許可しません。存在しない場合、ユーザーインスタンスはuser.participantsが空の配列と等しくなります。

2番目の質問に関して、特定のレースの特定の参加者を照会する場合は、両方のキーを使用する必要があります。 where participant_id = 7 and race_id = 4

+0

ええ、その余分なテーブルは一種の不要なものでした。実際にあなたのモデルは、Railsがどのようにデータベースと連携するかについていくつかの点を明確にするのに役立ちます。 ユーザーモデルでは、ユーザーhas_manyの参加者(おそらく名前が変更された参加者)がある場合、「has_many participations:through Races」は使用しません。これはレースであったことを暗示します?それは単に "has_many participationations"となるでしょうか?今は意味をなさないようです。 – DRobinson

+0

とにかく、私はあなたの答えを受け入れています。もともと私のデータベースの一部を考え出した方法に非常に似ています。テーブル内のヌル値の可能性が非常に高いため、「私の古いデータベース設計教授がこれを見たら私を殺すだろうと思っていました。 – DRobinson

0

レースには多くの参加者がおり(そのうちのいくつかはユーザーです)、参加者には多くのレースがあります(うまくいけば:-)。

これは、画像の中からユーザーの一部を瞬時に取り出して、これは、で説明されている、RailsとParticipantモデルの両方でhas_and_belongs_to_manyでRailsが美しく処理する単純な多対多の関係です。あなたのケースでは不要なもう1つの選択肢は、has_many :throughです。これは、結合テーブルに基づいたファーストクラスのモデルを作成します。しかし、あなたが説明したことはこれを不要にします。

ユーザーと参加者の関係は、1対1で条件付きです。あなたが参加者でなくてもユーザーになれるかどうかはわかりませんが、参加者であるユーザーがいる場合は、関係者に関係させたいと思います。これは:has_oneリレーションです。

あなたが探しているだろうと思っているレンタルサーバーのクールな部分は、関係が条件付きになる可能性があるということです。この場合、参加者はhas_oneというユーザーを条件付きで使用できます。リンクされたRailsガイドのドキュメントでは、このすべてを定義する方法について説明しています。

+0

レースを主催する場合は、ユーザーでなければなりません。その場合、レースはbelongs_to User、User has_many Racesはアサインされています。 –

関連する問題