Génération de liste sous contrainte

SQL vs programmation par la contrainte

a marqué ce sujet comme résolu.

Salut à tous.

Je me trouve actuellement avec un problème assez sioux, je trouve. S'il était indépendant de mon projet, je saurai le résoudre simplement par un script prolog (voire sûrement scala…) mais là je fais un webservice et j'ai besoin d'une bdd.

Donc voilà ce qu'il se passe :

j'ai une base de données avec des tonnes d'articles. dont la structure peut être décrite par cette classe :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
    public class Product
    {
        public int ID { get; set; }
        [Required]
        public string Product_name { get; set; }
        public double Price { get; set; }
        public string ImageURL { get; set; }
        [Required]
        public string Theme{ get; set; }
        public string Produi_EAN { get; set; }

        /// <summary>
        /// Store the current popularity so that the product will be selected only if it is popular.
        /// </summary>
        public int PopularityNote { get; set; }
}

A l'heure actuelle, je suis tout à fait capable de générer une liste d'articles qui sont dans un thème précis, qui ont un prix inférieur à une référence etc.

Mais voilà, j'aimerai pouvoir générer une liste pour laquelle la somme des prix doit être inférieur à un budget max. je dois aussi pouvoir décider que certains produits doivent faire partie de la liste.

Bref, comme je vous l'ai dit, cela est très facile à résoudre avec de la programmation par contrainte, mais mon niveau en SQL ne me le permet pas actuellement, vous auriez, des idées, des sources etc. pour m'aider?

PS : j'ai le contrôle total sur la conception de la bdd, alors vous pouvez me conseiller des fonctionnalités avancées je les intégrerai !

Salut !

C'est pour un système de produits composés (genre une tour d'ordinateur avec des composants) ?
Je me souviens qu'à une époque, j'étais tombé sur un tutoriel (il me semble sur developpez.com) qui présentait la manière de gérer une étagère (ou un autre meuble) avec ses parties (tiroirs, notamment, étant eux aussi composés de vis, planches, etc.)… Si je retrouve le lien, je viens éditer ce message.

Edit

Voilà. C'est pour DB2, et ça fait un petit moment que je l'ai lu, donc sans garantie que ça puisse s'appliquer à ton SGBD

+0 -0

En fait , ça va/peut se faire de différente manière mais ma principale contrainte c'est que je dois respecter l'idée du budget maximal pour la liste.

En gros j'ai une ressource à dépenser dans un thème (gageons, achat de jeux pay to win), et avec mon budget, je dois pouvoir proposer :

  • un jeu
  • un guide
  • des achats inapp (par exemple).

Je donne l'exemple du jeu car c'est une idée qui m'a été soufflée, les produits initiaux n'en seront pas, mais je n'ai pas envie de révéler la base du projet ^^.

Ma contrainte est donc bel et bien le budget. actuellement, j'ai un système qui est fonctionnel mais non performant :

1
2
3
4
5
6
7
8
query.OrderBy(m => m.Price);
double budget = GetBudgetFromUserQuery();
double currentBudget = query.Sum(m => m.Price);
while (currentBudget > budget)
{
    query.Skip(1);
    currentBudget = query.Sum(m => m.Price);
}

Actuellement, comment fais-tu pour "lier" les éléments de liste entre eux ?

Admettons que tu réussisses à avoir tes montants totaux par thème à grands coups de GROUP BY et de sum(), tu pourrais peut-être faire un HAVING pour pouvoir filtrer sur la somme, vu que les critères ne peuvent être mis sur une valeur calculée comme sum(…) ?

+0 -0

Je ne les "lie" pas. en fait , mon "thème" c'est juste dans mon exemple des jeux vidéo un marqueur pour les faire se rassembler. Ainsi lorsque j'ai le thème "Angry Birds" par exemple, il va me proposer tous les jeux angrybirds, un guide de score angry birds, un goody angry birds, des achats inapp angry birds.

Ce que je veux c'est proposer à mon utilisateur une sous liste parmi ces produits là de manière à ce que son budget soit respecter. Je n'ai pas besoin de l'optimum.

la seule chose que j'ai actuellement c'est que les articles ont une "note" de popularité donnée par un algorithme qui lui fonctionne super bien.

J'ai réfléchi au having, mais je ne pense pas vraiment que ça marche, non?

D'accord, maintenant que je pense avoir compris un peu mieux ton besoin, non, HAVING n'est pas vraiment ce que tu souhaites.

Du coup, je ne vois pas d'autre chose qu'un algorithme qui, pour chaque élément le plus populaire (après ceux déjà dans la liste), vérifie que la nouvelle somme est encore dans le budget. Je ne suis pas certain qu'il y ait une solution "directe" pour dire "Cette liste est dans le budget", du moins pas avec de "simples" requêtes. Peut-être qu'avec une procédure stockée oui, mais ce serait probablement reporter l'algorithme dans SQL plutôt que dans ASP.

Sinon, si Taguan passe par là, peut-être pourrait-elle avoir des idées plus précises et adaptées.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte