2015-12-06 1 views
2

J'ai base de données avec environ 50k (et en comptant) produits. De plus, les utilisateurs de mon site Web ont déclaré le pays de leur origine.Filtrer 50k + lignes par valeur autorisée ou bloquée

Maintenant, je dois ajouter à des domaines de produits comme allowed_countries et blocked_countries.

  • produit peut avoir ces champs vides - il sera affiché à tous les utilisateurs,
  • produit peut avoir allowed_countries rempli - il sera affiché SEULEMENT Les utilisateurs de ces pays,
  • produit peut avoir blocked_countries rempli - il sera montré à tous les utilisateurs, à l'exception des utilisateurs de la liste blocked_countries.

Un tel filtrage devrait s'appliquer dans le catalogue de produits, la page de produit et le moteur de recherche (actuellement recherche de texte intégral).

Comment concevoir efficacement une base de données pour de telles exigences? Ce que je prends soin est la performance sous une charge assez importante. Je pensais à des colonnes dynamiques dans MariaDB 10.0.20, mais je ne suis pas sûr de la vitesse de filtrage par exactement un pays.

Répondre

2

Utilisez une table de liaison

produits Table (id, d'autres données)

pays Table (id, nom, etc.)

table liant (product_id, country_id, autorisé) tout non nul, 1 signifie autorisés 0 signifie diallowed

select * from product 
left join linking linking_table on linking_table.product_id = product.id 
left join counties_table on (countries_table.id = linking_table.country_id) 

maintenant, le change où l ike cette

comtés autorisés

where countries_table.id = (USERS COUNTRY) and linking_table.allowed = 1 

ne peuvent pas

where countries_table.id = (USERS COUNTRY) and (linking_table.allowed = 1 or linking_table.allowed is null) 

Le second ajoute le cas où le produit ne marche pas avoir une liste noire.

Cela pourrait renvoyer plusieurs lignes par produit, de sorte que vous devrez soit par groupe ou retourner distinct

+0

Comment cela peut renvoyer plusieurs lignes par produit? Vous utilisez 'left join' pour éviter cela. –

+0

Utilisation de la jointure gauche pour le cas où aucun lien de pays n'est spécifié – exussum