我的Rails應用程序是用戶在彼此之間交易項目的系統。用戶對物品進行出價,然後所有者批准創建交易的出價。然後,用戶可以在交易中撰寫評論(消息),以便在應用程序之外組織內容。我有它迄今結構的方法是像這樣:Rails數據庫結構和優化建議
User
has_many :items
has_many :bids
Item
belongs_to :user
has_many :bids
Bid
belongs_to :item
belongs_to :user
has_one :transaction
Transaction
belongs_to :bid
has_many :messages
Message
belongs_to :transaction
belongs_to :from, :class_name => "User"
belongs_to :to, :class_name => "User"
我覺得這非常適用於減少冗餘方面,但我在這裏有出有效地獲取數據的幾個問題。例如,檢索user
的‘給定項目’(即用戶「我做了這對投標中的一個存在交易項目):
user.items.joins(:bids).where("bids.id" => Transaction.select("bid_id"))
或接收物品:
Item.joins(:bids).where("bids.user_id" => user.id).where("bids.id" => Transaction.select("bid_id"))
這似乎是相當昂貴的我想要的信息。
更重要的是,我想彙總用戶的交易並顯示給定與收到的項目的比率,這些項目可能顯示在任何給定頁面上的用戶名旁邊。目前我正在做的是提取和計算所有用戶的給定和收到的項目,然後進行分割(這是非常昂貴的...)。我在考慮在用戶表上使用received_count和given_count列,每次創建或銷燬事務時都會更新,但這似乎不可靠。
我的問題是,有沒有更好的方式來構建我的數據,以便像用戶交易一樣獲取信息要簡單得多,同時保持它的規範化?
謝謝!
感謝您的建議 - 這使我更加有信心爲現在添加額外的緩存列。也許我會仔細研究memcached(我正在Heroku上部署,所以直接添加額外的過程有點多..) – tom 2012-08-12 06:48:29
當時機到來時,heroku使得使用memcached變得非常簡單(當然,它的成本多一點錢)。 – 2012-08-12 07:04:59