0

我想定制:

1. 主页
上的交易顺序 2. 电子邮件取决于用户看到的交易。

感谢SO 上的人,似乎最好有 3 个模型和表“standard_user”、“deals”和“deals_participation”,以便拥有应用程序需要的多对多关系,一个链接表如下:

class DealParticipation < ActiveRecord:Base
#This means the deal_participations table has a standard_user_id key
belongs_to :standard_user
#This means the deal_participations table has a deal_id key
belongs_to :deal
#... more logic goes here ...
end

class StandardUser < ActiveRecord::Base
has_many :deal_participations
has_many :deals, :through => :deal_participations
# ... more logic goes here ...
end

class Deal < ActiveRecord::Base
has_many :deal_participations
has_many :standard_users, :through => :deal_participations
belongs_to :admin_user
#... more logic goes here ...
end

我迷路的地方是:我应该如何存储以及应该查询某个用户参与的哪些交易的数据:

  • 我应该存储这个 deal_participation_table 吗?它的列是deals_participation_id/user_id/deals_id,我担心deals_participation表查询起来效率很低,因为我必须搜索大量行,找到user = Mathieu45(示例)的位置,然后找到相应的交易并进行一些交易进行某种计算以了解他对哪种交易感兴趣,然后使用该信息来调整主页上的交易列表(以及发送给他的电子邮件)。
  • 我应该将其存储在 users_table 本身中,以便根据 user_id 直接访问他所做的交易吗?
  • 将其存储在另一个专用于 user_history 的表中?
4

1 回答 1

1

如果您在表上放置了正确的索引,您所描述的模式对于您感兴趣的查询类型将非常有效。数据库的行为不像列表:询问“XXX 参与了哪些交易”的问题不应该扫描整个表,因为正确索引的表将确切地知道在哪里可以找到 XXX 的所有交易。

为了正确设置此设置,您的迁移将如下所示:

class CreateStandardUsers < ActiveRecord::Migration
  def change
    create_table :standard_users do |t|
      t.string :name
      t.timestamps
      # More fields go here
    end

    add_index :standard_users, :name
  end
end

class CreateDeals < ActiveRecord::Migration
  def change
    create_table :deals do |t|
      t.references :admin_user
      # other fields go here
    end

    add_index :deals, :admin_user_id
    # other indices go here... anything you want to search on efficiently.
  end
end

class CreateDealParticipations < ActiveRecord::Migration
  def change
    create_table :deal_participations do |t|
      t.references :standard_user
      t.references :deal

      t.timestamps
    end

    add_index :deal_participations, :standard_user_id
    add_index :deal_participations, :deal_id
    add_index :deal_participations, :created_at
  end
end

这些迁移中还有更多内容(例如,您应该添加非空约束、唯一性约束等)。但关键是拥有这些索引会使您描述的数据库操作非常快。

于 2013-04-25T23:54:24.053 回答