1

さて、私にはユーザーと会社があります。私はユーザーの95%が1つの会社しか持っていないので、1対多の会社を作りたかったのです。

ユーザーテーブル

create_table "users"
  string   "email",
  string   "first_name"
  string   "last_name"
  string   "phone_number"
  integer  "company_id"

しかし、問題は、複数の会社に関連付ける必要のある管理者と、2つの会社を持つシステム内の少数のユーザーがいることです。

それで、多対多の関係のために、私は結合テーブルを想定しました

テーブルに参加

"company_users"
  t.integer  "company_id"
  t.integer  "user_id"

しかし、ユーザーの会社を頻繁に評価する必要があるため、会社に簡単にアクセスできるようにし、ユーザーの5%の参加テーブルを用意するのは嫌です。何か案は?

4

4 に答える 4

3

複数の会社の管理者に関するデータを除外しない限り、リンクテーブルを使用する方法はありません。多対多と主要企業の両方を追跡することをお勧めします。

 class User
   belongs_to :primary_company, :class_name => Company
   has_many :company_users
   has_many :companies, :through => :company_users
 end
于 2012-05-17T19:22:24.077 に答える
2

残念ながら、複数の会社を持つシステムに1人のユーザーしかいなかったとしても、多対多になります。

  1. ユーザーが会社ごとに1つずつ、合計2つのレコードを持つように要求することもできますが、それは理想的ではないようです。
  2. 2つの外部キーをCompanyonUserに配置しbelongs_to :company, foreign_key: 'company1_id'、異なる外部キーを使用して2回宣言することができます。まったく理想的ではありませんが、機能する可能性があります。
  3. 配列をサポートし、company_idsの配列を持つデータベースを使用できます。ただし、これはActiveRecordでは簡単に機能しません。ただし、MongoDBの使用がオプションである場合、Mongoidはこれを適切にサポートします。
  4. ほとんどの場合、結合テーブルが必要になるだけです。その役割(管理者、従業員など)に別のフィールドを配置して、モデルをポジションと呼ぶことを検討します。次に、ユーザーhas_many :positionshas_many :companies, through: :positions。これにより非常に多くの結合が発生する場合は、それをキャッシュする方法を見つける必要があります。Railsでは実際にキャッシングは本当に簡単です。

RailsキャッシングRails
での低レベルのキャッシング

于 2012-05-17T18:59:59.080 に答える
0

非正規化できます。

ブールフラグ' only_1_company'を追加します。

トリガーで維持します。

于 2013-01-27T20:14:31.833 に答える
0

私は答えを読み直しました、そして今あなたの問題がにあると感じます

「会社に簡単にアクセスできるようにしたいのですが、ユーザーの5%が参加テーブルを持つのは嫌です。」

この事実を「嫌​​い」なのは何ですか?「わずか5%」は、実際にアプリケーションアーキテクチャ、パフォーマンス、またはユーザビリティにどのように影響しますか?

ユーザーに発生している問題に焦点を当てます。UIが混乱したり遅すぎたりする場合は、その問題に基づいて作業してください。

「起こり得る」将来のパフォーマンスの問題を排除しようとすることは、一般的に時間の不適切な使用であると考えられています。その時までにアプリケーションはかなり変わるかもしれません。また、パフォーマンスに対処することは、非正規化のようなアプローチを意味する場合があり、正確な問題が特定されるまで、そのようなアプローチを使用したくないことは間違いありません。

また、データベースは結合テーブルを介してレコードを検索する際に非常に効率的に作成されているため、現在実際に問題が発生していない限り、非効率性について心配する必要はありません。

于 2013-03-30T13:49:33.237 に答える