Meilleur moyen de réaliser une matrice d'exclusion via une requête
-
06-07-2019 - |
Question
Quel est le meilleur moyen de réaliser cette matrice d'exclusion via une requête.
Il y a un nombre fixe de produits dans un tableau. L'idée est que si un produit est vendu à un client (représenté par une ligne), les autres produits (colonnes) peuvent être vendus ou non en fonction de la matrice de règles ci-dessous. L’objectif est d’obtenir le code produit qui est autorisé à être vendu pour n’importe quel code produit vendu.
ProductCode|MRLSPN|MRLSPPN|MRLSDF|MRLSPDF|LGS|LGP|HOBN|HODF|HVO|HVOF
MRLSPN |No |No |No |No |No |Yes|No |No |No |No
MRLSPPN |No |No |No |No |No |No |No |No |No |No
MRLSDF |No |No |No |No |No |Yes|No |No |No |No
MRLSPDF |No |No |No |No |No |No |No |No |No |No
LGS |No |No |No |No |No |Yes|No |No |No |No
LGP |Yes |No |Yes |No |No |No |No |No |No |No
HOBN |No |No |No |No |Yes|Yes|No |No |No |No
HODF |No |No |No |No |Yes|Yes|No |No |No |No
HVO |Yes |Yes |Yes |Yes |Yes|Yes|Yes |Yes |No |No
HVOF |Yes |Yes |Yes |Yes |Yes|Yes|Yes |Yes |No |No
Prêt par rangée dans les colonnes.
La solution
Pouvez-vous changer votre format d'une matrice à une table d'association comme
Table AdditionalProducts: SoldProductCode AdditionalProductCode
Ainsi, votre table ressemblerait à
SoldProdCode, Additional ProdCode
MRLSPN, LGP
MRLSDF, LGP
Maintenant, vous pouvez simplement lancer une requête pour dire
SELECT AdditionalProductCode
FROM AdditionalProducts
WHERE SoldProductcode='MRLSPN'
Modifier
Un autre avantage de cette approche est que, si vous offrez des réductions spéciales si vous achetez MRLSPN, vous obtenez LGP à 10% de réduction et si vous achetez MRLSDF, vous pourriez bénéficier d’une réduction de 15 $. Avec ce modèle, vous pouvez étendre la table d'association pour inclure des attributs supplémentaires. Cela peut ou non s’appliquer à votre modèle.
Autres conseils
C'est une table de liens plusieurs-à-plusieurs:
Sold CanBeSold ---- --------- MRLSPN LGP MRLSDF LGP …
et une requête:
SELECT CanBeSold
FROM matrix
WHERE Sold = @Product
Si vous ne pouvez pas garantir plus de 32 colonnes, vous pouvez l'implémenter en utilisant un int (32 bits) comme champ indicateur de bits. Mais une relation plusieurs-à-plusieurs sera plus flexible.
Créer une table de mappage plusieurs à plusieurs, ProductCode2ProductCodeMapping
CREATE TABLE ProductCode2ProductCodeMapping
(
ProductCodeId int,
AllowedProductCodeId int
)
Avec une clé primaire composite utilisant ces deux colonnes.
Ensuite, insérez une ligne pour chaque produit et produit associé.
Ensuite, interrogez simplement en tant que:
SELECT AllowedProductCodeId
FROM ProductCode2ProductCodeMapping
WHERE ProductCodeId = @myProductCodeId
Si vous n'avez pas d'identifiant entier pour les produits, vous pouvez les ajouter ou utiliser le code de produit char (car je préférerais l'ancien)