1

好的,所以我有用户和公司。我有 95% 的用户将只有一家公司,所以我想做一对多。

用户表

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

但问题是有些管理员需要与不止一家公司相关联,而系统中的一些用户则拥有两家公司。

因此,由于多对多关系,我假设了一个连接表

加入表

"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. 您可以要求用户有两条记录,每家公司一条,但这似乎并不理想。
  2. 您可以将 2 个外键放在用户上的 Company 中,并belongs_to :company, foreign_key: 'company1_id'使用不同的外键声明两次。一点都不理想,但它可以工作。
  3. 您可以使用支持数组并拥有一组 company_id 的数据库。不过,这并不容易与 ActiveRecord 一起使用。但是,如果使用 MongoDB 是一个选项,Mongoid 对此有很好的支持。
  4. 最有可能的是,您只需要一个连接表。我会考虑为角色(管理员、员工等)放置另一个字段并调用模型位置。然后一个用户has_many :positionshas_many :companies, through: :positions. 如果这会导致大量连接,您将需要找到一种方法来缓存它。在 Rails 中缓存实际上非常简单。

Rails 缓存 Rails
中的低级缓存

于 2012-05-17T18:59:59.080 回答
0

我重新阅读了答案,现在觉得您的问题出在

“我希望能够轻松访问公司,并且讨厌为 5% 的用户提供连接表。”

你“讨厌”这个事实是什么?“只有 5%”实际上是如何影响应用程序架构或性能或可用性的?

专注于向您的用户显示的问题。如果他们发现 ui 令人困惑或太慢,则根据该问题进行工作。

试图消除“可能的”未来性能问题通常被认为是浪费时间。到那时,应用程序可能会发生很大变化。此外,解决性能问题可能意味着诸如非规范化之类的方法,在确定确切问题之前,您绝对不想使用此类方法。

此外,数据库在通过连接表查找记录时非常有效,所以我不会担心效率低下,除非它们现在引起实际问题。

于 2013-03-30T13:49:33.237 回答
0

您可以非规范化。

添加一个布尔标志“ only_1_company”。

用触发器维护它。

于 2013-01-27T20:14:31.833 回答