Deze vraag heeft wat raakvlakken met [Java] Efficienter varianten bitmap genereren (winkelmand)
TL;DR
Beste DEVvers,
momenteel zit ik met de volgende uitdaging in mijn maag.
Wij hebben een (zogenaamde) megamatrix van producten en hun functionaliteit.
Dit zit verdeeld over twee tabellen (product en functionaliteit) en een koppeltabel.
Ieder product heeft een uniek id en iedere functionaliteit heeft ook zijn unieke id.
Het koppeltabel heeft dus drie kolommen, id, prod_id en func_id. Wanneer een product bepaalde functionaliteit niet heeft, komt de koppeling ook niet voor in de koppeltabel.
We hebben momenteel een productselector, daarop kan een (potentiële) klant aangeven welke functionaliteit hij zoekt. Hij krijgt dus alle mogelijke functies voorgeschoteld, daarin kan hij vinkjes zetten.
Nu is het aan mij de taak om een product te zoeken dat hier zo dicht mogelijk bij in de buurt komt qua functionaliteit.
Er zijn een aantal eisen:
Een klant mag NOOIT een productadvies krijgen met minder functionaliteit dan gewenst.
Wanneer er geen producten zijn die aan de wensen van de klant voldoen, moeten er meerdere producten terugkomen die de gewenste functionaliteit wel bieden. Er moet dan het product met de meeste functionaliteit voorkomen en een product dat de overige functionaliteit vervult (of weer meerdere producten).
We hebben momenteel 320 producten en ongeveer 150 functionaliteiten.
Ik heb hier al een aantal dagen over nagedacht, maar ik wil deze "berekening" op de volgende manier uitvoeren.
Voor elk product maken we een 150-bits grote hash, dit doen we voor ieder product. De 150 bits worden dus samengesteld uit de functionaliteit (func_id ASC). Wanneer een functionaliteit wel voorkomt kan er een 1 worden gezet, anders een 0 (of precies andersom, ik weet niet wat performancewise het gunstigste is).
Omdat dit volgens mij initieel al veel rekenkracht kost, kan deze hash middels een cronjob eenmaal daags berekend worden.
Wanneer een klant een aantal vinkjes heeft gezet, dan maken we aan de hand van zijn wensen ook eenzelfde hash. Deze hash wil ik dan met de product-hash vergelijken.
Door de eis dat een product tenminste de gestelde eisen moet hebben, kan ik niet domweg de hamming distance berekenen. Omdat ik dan niet kan zien of het bitverschil in het voordeel of in het nadeel van de wensen van de klant is.
Om dat probleem te omzeilen, kan ik natuurlijk kijken hoeveel bits er in het product aanstaan en hoeveel bits er in de productwens aanstaan (eventueel een extra kolom in de hash-tabel). Het aantal bits in de productwens mag nooit hoger zijn dan het aantal in het bestaande product.
Dit mag natuurlijk wel indien er geen enkel product is dat aan de wensen van de klant voldoet, dan moet er dus een productselectie gegeven worden. Dit is echter een zorg voor later.
Ik kwam op SO wel het volgende topic tegen: http://stackoverflow.com/...-on-binary-strings-in-sql
Ik snap echter niet goed wat er staat, te meer omdat ik niet thuis ben in de Data Types van MySQL.
Om binnen de mooie abstracte getallen van de 2^n te blijven, is het misschien een goed idee om 256-bits grootte hash te maken, waar de bovenste bitjes dont care zijn, zolang er geen functionaliteit is.
TL;DR:
Ik zoek dus eigenlijk twee dingen
1. Een manier om die hashes (150bits+) zo efficiënt mogelijk op te slaan.
2. Een manier om die hashes zo efficiënt mogelijk te vergelijken met de hash die voortvloeit uit de wensen van de klant.
Alvast bedankt voor jullie meedenken
TL;DR
Beste DEVvers,
momenteel zit ik met de volgende uitdaging in mijn maag.
Wij hebben een (zogenaamde) megamatrix van producten en hun functionaliteit.
Dit zit verdeeld over twee tabellen (product en functionaliteit) en een koppeltabel.
Ieder product heeft een uniek id en iedere functionaliteit heeft ook zijn unieke id.
Het koppeltabel heeft dus drie kolommen, id, prod_id en func_id. Wanneer een product bepaalde functionaliteit niet heeft, komt de koppeling ook niet voor in de koppeltabel.
We hebben momenteel een productselector, daarop kan een (potentiële) klant aangeven welke functionaliteit hij zoekt. Hij krijgt dus alle mogelijke functies voorgeschoteld, daarin kan hij vinkjes zetten.
Nu is het aan mij de taak om een product te zoeken dat hier zo dicht mogelijk bij in de buurt komt qua functionaliteit.
Er zijn een aantal eisen:
Een klant mag NOOIT een productadvies krijgen met minder functionaliteit dan gewenst.
Wanneer er geen producten zijn die aan de wensen van de klant voldoen, moeten er meerdere producten terugkomen die de gewenste functionaliteit wel bieden. Er moet dan het product met de meeste functionaliteit voorkomen en een product dat de overige functionaliteit vervult (of weer meerdere producten).
We hebben momenteel 320 producten en ongeveer 150 functionaliteiten.
Ik heb hier al een aantal dagen over nagedacht, maar ik wil deze "berekening" op de volgende manier uitvoeren.
Voor elk product maken we een 150-bits grote hash, dit doen we voor ieder product. De 150 bits worden dus samengesteld uit de functionaliteit (func_id ASC). Wanneer een functionaliteit wel voorkomt kan er een 1 worden gezet, anders een 0 (of precies andersom, ik weet niet wat performancewise het gunstigste is).
Omdat dit volgens mij initieel al veel rekenkracht kost, kan deze hash middels een cronjob eenmaal daags berekend worden.
Wanneer een klant een aantal vinkjes heeft gezet, dan maken we aan de hand van zijn wensen ook eenzelfde hash. Deze hash wil ik dan met de product-hash vergelijken.
Door de eis dat een product tenminste de gestelde eisen moet hebben, kan ik niet domweg de hamming distance berekenen. Omdat ik dan niet kan zien of het bitverschil in het voordeel of in het nadeel van de wensen van de klant is.
Om dat probleem te omzeilen, kan ik natuurlijk kijken hoeveel bits er in het product aanstaan en hoeveel bits er in de productwens aanstaan (eventueel een extra kolom in de hash-tabel). Het aantal bits in de productwens mag nooit hoger zijn dan het aantal in het bestaande product.
Dit mag natuurlijk wel indien er geen enkel product is dat aan de wensen van de klant voldoet, dan moet er dus een productselectie gegeven worden. Dit is echter een zorg voor later.
Ik kwam op SO wel het volgende topic tegen: http://stackoverflow.com/...-on-binary-strings-in-sql
Ik snap echter niet goed wat er staat, te meer omdat ik niet thuis ben in de Data Types van MySQL.
Om binnen de mooie abstracte getallen van de 2^n te blijven, is het misschien een goed idee om 256-bits grootte hash te maken, waar de bovenste bitjes dont care zijn, zolang er geen functionaliteit is.
TL;DR:
Ik zoek dus eigenlijk twee dingen
1. Een manier om die hashes (150bits+) zo efficiënt mogelijk op te slaan.
2. Een manier om die hashes zo efficiënt mogelijk te vergelijken met de hash die voortvloeit uit de wensen van de klant.
Alvast bedankt voor jullie meedenken
If money talks then I'm a mime
If time is money then I'm out of time