Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Passen Sie die Startseite und E-Mails der Deals-App dank des Benutzerverlaufs an:Wie macht man das richtig auf Rails/postgreSQL?

Das von Ihnen beschriebene Schema ist für die Art von Abfrage, an der Sie interessiert sind, sehr effizient, vorausgesetzt, Sie setzen die richtigen Indizes in Ihre Tabellen. Datenbanken verhalten sich nicht wie Listen:Die Frage "An welchen Deals hat XXX teilgenommen" sollte nicht die ganze Tabelle scannen, da eine korrekt indizierte Tabelle genau weiß, wo alle Deals von XXX zu finden sind.

Um dies richtig einzurichten, sehen Ihre Migrationen folgendermaßen aus:

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

Es gibt noch viel mehr, was in diese Migrationen gehört (z. B. sollten Sie Nicht-Null-Beschränkungen, Eindeutigkeitsbeschränkungen usw. hinzufügen). Aber der Punkt ist, dass diese Indizes die Datenbankoperationen, die Sie beschreiben, extrem schnell machen.