[Persönliche Anmerkung] Berücksichtigung des Rails DB-Index

Ich habe den Index nicht gut verstanden, also habe ich den folgenden Artikel gelesen und darüber nachgedacht.

Schienen: Indizieren Sie keine dunklen Wolken (Übersetzung)

Der Index scheint durch separates Kopieren der sortierten Spalten erstellt zu werden. Ich konnte es nicht verstehen, also werde ich darüber nachdenken.

Ich schreibe unter der Annahme, dass ich unerfahren und falsch bin. Bitte beziehen Sie sich nicht darauf.

Im obigen Artikel gab es das folgende Modell als Beispiel.

class ShoppingCart < ActiveRecord::Base
  has_many :shopping_cart_products
  has_many :products, through: :shopping_cart_products
end

class ShoppingCartProduct < ActiveRecord::Base
  belongs_to :shopping_cart
  belongs_to :product
end

class Product < ActiveRecord::Base
end

Einkaufswagen ShoppingCartProduct Produkt

Ich mache drei Modelle, aber ich bin von hier gestolpert.

Ich fragte mich, ob es notwendig war, das Zwischenprodukt ShoppingCartProduct zu wagen. Was ist der Grund dafür, dass der Warenkorb nicht direkt mit dem Produkt verknüpft wird?

Wenn ShoppingCart und Produkt zugeordnet sind Sie werden die Artikel in Ihrem Warenkorb abfragen.

Was ist falsch daran, Produkte direkt abzufragen? Ich sage, dass ich es wage, hier Warenkorbprodukte zu verwenden, und dass die DB Abfragen so weit wie möglich beschleunigen möchte. Es besteht kaum ein Zweifel daran, dass das Gesetz zu effizienten Ergebnissen führen wird, wenn dazwischen Wagenartikel eingreifen. Die Annahme ist, dass eine direkte Abfrage des Produkts es einfach verlangsamen würde.

Warum ist es spät? Es ist spekulativ, da nicht alle spezifischen Spalten und Daten im Referenzartikel geschrieben sind. Wenn das Warenkorbmodell direkt mit dem Produkt verknüpft ist, befinden sich mehrere Produkte im Warenkorb. Um die Produkte zu durchsuchen, müssen Sie dann die mit der Warenkorb-ID verbundenen Produkte aus dem Produktmodell extrahieren.

Angenommen, Sie möchten hier einen Index einfügen. Die Produkte sind in der Reihenfolge der Warenkorb-ID sortiert. Erstellen Sie eine weitere Spalte im Produktmodell, damit diese mit der Produkt-ID verknüpft werden kann. Der Index scheint langsam zu schreiben, da er eine zusätzliche Spalte erstellt. Das erste, woran ich dachte, war, den Index jedes Mal aufzunehmen, wenn ich das Produktmodell aufrufen wollte. Ich fragte mich, ob ich suchen würde. Zweitens wird das Schreiben verzögert, da jedes Mal, wenn ein Produkt hinzugefügt wird, ein Index hinzugefügt wird. Drittens müssen Sie bei der Suche nach verwandten Produkten aus dem Warenkorb nach den Produkten im Warenkorb aus der riesigen Produktliste suchen. Ein Wagen ändert sich häufig, und ich beziehe mich oft darauf. Unabhängig davon, wie stark das Produktmodell mit der Warenkorb-ID zusammenhängt, Ist es nicht schwierig, jedes Mal in den Warenkorb zu schauen und das Produktmodell abzufragen? Ich vermute, dass der dritte Grund die korrekte Verlangsamung ist, was wahrscheinlich der Grund für die Aufnahme des Produktmodells des Wagens ist.

Hier durch Positionieren des Produktmodells des Wagens als Mitte, Wenn Sie auf die Schaltfläche In den Warenkorb klicken, wird der Warenkorb dem Produkt zugeordnet. Ist es nicht erforderlich, eine Zwischenstufe zu haben, wenn Sie auf die Schaltfläche In den Warenkorb klicken? Dachte ich auch Es ist wahrscheinlich in Ordnung, eine direkte Verbindung zwischen dem Warenkorb und dem Artikel herzustellen.

Wenn Sie die Warenkorb-Taste drücken, erstellen Sie ein Warenkorb-Produktmodell basierend auf Ihrer Warenkorb-ID und Produkt-ID. Es ist ein Verständnis von Vermittlung.

class CreateShoppingCartProducts < ActiveRecord::Migration
  def change
    create_table :shopping_cart_products do |t|
      t.integer :quantity, limit: 1, null: false
      t.belongs_to :shopping_cart, index: true, foreign_key: true
      t.belongs_to :product, index: true, foreign_key: true

      t.timestamps null: false
    end
  end
end

Wie für den Index, Wenn Sie sich die Liste der Einkaufswagen ansehen, suchen Sie nach Artikeln im Einkaufswagen. Sie können direkt nach Produkten suchen, aber ich denke, Sie möchten nicht für jedes Produkt einen Index erstellen. In diesem Fall denke ich, dass ich den Index der Warenkorb-ID auf die Produkte im Warenkorb setzen und nach den Produkten aus der Produkt-ID suchen möchte.

Im Beispiel des obigen Artikels ist es falsch, den Index zwischen Warenkörben und Produkten im Warenkorb sowie zwischen Produkten im Warenkorb zu platzieren. Er sagt, lege keinen Index zwischen die Artikel im Warenkorb. Der Grund ist, dass Produkte aus dem Warenkorb gesucht werden, aber nicht umgekehrt. Dadurch wird der Index zwischen den Artikeln im Warenkorb gelöscht. In dem Artikel heißt es, Indizes wie folgt hinzuzufügen und zu entfernen:

python


class RemoveIndexShoppingCartProductsOnProductId < ActiveRecord::Migration
  def up
    remove_index(:shopping_cart_products, :product_id)
  end

  def down
    add_index(:shopping_cart_products, :product_id)
  end
end

Ich verstehe ein wenig, wie man indiziert, Ich hatte das Gefühl, dass das Design von DB noch nicht aufholte Betrachten wir ein einfaches DB-Entwurfsbeispiel.

Anstatt nur unwissentlich ein allgemeines DB-Konfigurationsbeispiel zu verwenden Es ist auch notwendig, einmal anzuhalten und darüber nachzudenken, warum ein solches Design hergestellt wird.

Recommended Posts

[Persönliche Anmerkung] Berücksichtigung des Rails DB-Index
Schienen db: 〇〇 Zusammenfassung
[Hinweis] Rails-Fehlerliste
Schienen db: Migration fehlgeschlagen!
[Rails] Rails DB-Befehlsübersicht
[Hinweis] Bestätigung des Rails3-Routings
Schienen testen db nur fallen
Spannende persönliche Entwicklung mit Rails Teil 1: Versuchen Sie, Spezifikationen und DB zu entwerfen