[Note personnelle] Prise en compte de l’index Rails DB

Je n'ai pas bien compris l'index, j'ai donc lu l'article suivant et j'y ai réfléchi.

Rails: ne pas indexer les nuages sombres (traduction)

L'index semble être créé en copiant les colonnes triées séparément. Je ne pouvais pas le comprendre, alors je vais y réfléchir.

J'écris en partant du principe que je suis inexpérimenté et que je me trompe, alors veuillez ne pas y faire référence.

Dans l'article ci-dessus, il y avait le modèle suivant à titre d'exemple.

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

Panier ShoppingCartProduit Produit

Je fabrique trois modèles, mais j'ai trébuché d'ici.

Je me suis demandé s'il fallait oser faire du ShoppingCartProduct intermédiaire. Quelle est la raison de ne pas associer directement le panier avec le produit?

Si ShoppingCart et produit sont associés Vous interrogerez les articles de votre panier.

Quel est le problème avec l'interrogation directe des produits? Je dis que j'ose utiliser des produits de panier ici et que DB veut accélérer les requêtes autant que possible. Il ne fait aucun doute que la loi aboutira à des résultats efficaces avec l'intervention d'articles de chariot entre les deux. L'hypothèse est que l'interrogation directe du produit le ralentirait simplement.

Pourquoi est-il tard? C'est spéculatif car toutes les colonnes et données spécifiques ne sont pas écrites dans l'article de référence. Si le modèle de panier est directement associé au produit, il y a plusieurs produits dans le panier. Ensuite, afin de parcourir les produits, il est nécessaire d'extraire les produits liés à l'ID de panier du modèle de produit.

Par exemple, supposons que vous souhaitiez placer un index ici. Les produits sont triés par ID de panier. Créez une autre colonne dans le modèle de produit afin qu'elle puisse être liée à l'ID de produit. L'index semble être lent à écrire car il crée une colonne supplémentaire. La première chose à laquelle j'ai pensé était d'inclure l'index chaque fois que je voulais appeler le modèle de produit. Je me suis demandé si je chercherais. Deuxièmement, l'écriture sera retardée car un index sera ajouté chaque fois qu'un produit est ajouté. Troisièmement, lorsque vous recherchez des produits connexes dans le panier, vous devez rechercher les produits dans le panier dans la vaste liste de produits. Le contenu d'un chariot change fréquemment et j'y fais référence plusieurs fois. Peu importe à quel point le modèle de produit est lié à l'ID du panier, N'est-il pas difficile de regarder le panier et d'interroger le modèle de produit à chaque fois? Je suppose que la troisième raison est le ralentissement correct, qui est probablement la raison pour laquelle le modèle de produit du chariot est inclus.

Ici, en positionnant le modèle de produit du chariot au milieu, Lorsque vous appuyez sur le bouton Ajouter au panier, le panier est associé au produit. N'est-il pas nécessaire d'avoir un intermédiaire en appuyant sur le bouton Ajouter au panier? J'ai aussi pensé Il est probablement normal d'avoir un lien direct entre le panier et l'article.

Lorsque vous appuyez sur le bouton du panier, créez un modèle de produit de panier basé sur votre ID de panier et votre ID de produit, C'est une compréhension de la médiation.

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

Quant à l'index, Lorsque vous consultez la liste des paniers, recherchez les articles dans le panier. Vous pouvez rechercher des produits directement, mais je pense que vous ne voulez pas mettre un index sur chaque produit. Dans ce cas, je pense que je voudrais mettre l'index de l'ID de panier sur les produits dans le panier et rechercher les produits à partir de l'ID de produit.

Dans l'exemple de l'article ci-dessus, il est erroné de mettre l'index entre les paniers et les produits dans le panier, et entre les produits dans le panier. Il dit de ne pas mettre d'index entre les articles du panier. La raison en est que les produits sont recherchés à partir du panier, mais pas l'inverse. Cela tombera, donc l'index entre les articles dans le panier sera supprimé. L'article dit d'ajouter et de supprimer des index comme suit:

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

Je comprends un peu comment indexer, Je sentais que le design de DB ne rattrapait pas encore son retard, donc Prenons un exemple de conception de base de données simple.

Plutôt que d'utiliser simplement sans le savoir un exemple de configuration de base de données générale Il faut également du temps pour s'arrêter et réfléchir à la raison pour laquelle c'est la conception.

Recommended Posts

[Note personnelle] Prise en compte de l’index Rails DB
rails db: 〇〇 Résumé
[Note] Liste des erreurs de rails
rails db: échec de la migration!
Résumé de la commande [Rails] rails db
[Note] Confirmation de routage Rails3
rails test db seulement chute
Développement personnel passionnant avec Rails Partie 1: Essayez de concevoir des spécifications et une base de données