Quelqu'un pourrait-il me donner une idée de créer cette structure de base de données. Voici un exemple:
Table "products": id,productname,countries 1,"product1",(1,2,4) // available in countries US, DE, IT. 2,"product2",(2,3,4) // available in countries DE, FR, IT.
5 Réponses :
Vous pouvez également faire une troisième table pays_products avec champs pays_id et produit_id. p>
Sans dénormalisation, vous devez ajouter une table supplémentaire
Table Product countries ProductID CountryID 1 1 1 2 1 4...
Vous avez besoin d'une table d'intersection pour ce Plusieurs à plusieurs a> relation. vous alors rejoindre interne Les 3 tables pour obtenir votre liste de pays et de produits. P> Select * From Country
Inner Join CountryProduct On Country.CountryID = CountryProduct.CountryID
Inner Join Product On CountryProduct.ProductID = Product.ProductID
De quoi vous parlez est la normalisation. Vous avez une structure à plusieurs à plusieurs, vous devez donc créer une autre table pour relier les deux. Vous ne devriez jamais (ok, presque jamais) utiliser des chaînes délimitées pour stocker une liste de valeurs dans une base de données relationnelle.
Voici un exemple de la configuration: p> Vous pouvez ensuite obtenir une liste de produits pris en charge pour un identifiant de pays comme celui-ci: P> SELECT * FROM products, product_countries
WHERE products.id = product_countries.productid
AND product_countries.countryid = $cid
Pourquoi ne pas utiliser de rejoindre? Cela me semble toujours un peu étrange pour moi
La logique lors de l'utilisation d'un JOIN CODE> serait plus confondre à un débutant SQL, que l'OP est clairement. Bien sûr, un
rejoindre code> fonctionnerait également, mais sans cela, la logique est plus claire et plus facile à comprendre.
Merci et tous les autres pour avoir aidé !! Oui, SQL-Newbie ici. Une sous-requête: cette déclaration SQL semble ralentie pour moi - supposons que j'avais plus de 100 produits, cela ne prendrait pas beaucoup de temps à itérer à travers Product_Country?
Ne devrait pas faire. Étant donné que les deux colonnes sont à la fois des clés primaires et étrangères, elles seront indexées.
La meilleure approche pour les bases de données relationnelles est la suivante: p>
une table pour les coutries, disons pays_id, country_desc (pays_id est primaire) p>
une table pour les produits, disons produit_id, product_desc et autant de colonnes que vous voulez (Product_ID est primaire) p>
Si vous n'aviez qu'un seul pays, il serait suffisant d'avoir une clé étrangère pointant vers Country_ID dans chaque ligne de produit. Avoir une clé étrangère affirme qu'il y a un pays réel qui regrette de pays_id faisant référence à la table des pays. P>
Dans votre cas, vous avez plusieurs pays pour un produit, alors ajoutez une table d'association distincte produit_id, pays_id p>
Les deux clés primaires et les deux étrangers également. p>