2013-04-25 2 views
0

Я хотел бы настроить:Настроить сайт и электронные письма с предложениями по электронной почте благодаря истории пользователей: как это сделать правильно на Rails/postgreSQL?

1. Порядок сделок на домашней странице
2. Сообщения электронной почты в зависимости от сделок пользователь видел.

Благодаря people on SO, мне кажется, что лучше было бы иметь 3 модели и таблицы «standard_user», «предложения» и «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 

Где я потерял: как я должен хранить и какие таблицы следует запрашивать данные из которых наносит определенный пользователь принимает участие в:

  • s Могу ли я хранить этот deal_participation_table? Его столбцы являются deal_participation_id/user_id/deals_id, я боюсь, что таблица сделок будет крайне неэффективной для запроса, поскольку мне придется искать огромное количество строк, чтобы найти, где user = Mathieu45 (пример), затем найти соответствующие сделки и сделать некоторые чтобы узнать, какие сделки он интересует, а затем использовать эту информацию, чтобы скорректировать список сделок на главной странице (и отправленные ему электронные письма).
  • Должен ли я вместо этого хранить его в самой user_table, чтобы иметь прямой доступ на основе user_id к сделкам, которые он сделал?
  • хранить его в другой таблице, посвященной user_history?

ответ

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 

Там еще многое другое, что принадлежит в этих миграциях (например, вы должны добавить ненулевые ограничения, ограничение уникальности, и т.д). Но дело в том, что наличие этих индексов делает операции с базой данных, которые вы описываете, очень быстро.

 Смежные вопросы

  • Нет связанных вопросов^_^