Je veux mettre à jour régulièrement les lignes dans une base de données, mais aussi souhaiter des lignes plus populaires (des lignes demandées plus) d'être mises à jour plus souvent. Je pensais que je pouvais fonder cela sur deux paramètres: la popularité et le temps depuis la dernière mise à jour.
SELECT * FROM results ORDER BY last_updated, popularity;
3 Réponses :
La difficulté sera de définir le niveau d'importance entre la popularité et la dernière mise à jour.
Comment la valeur de popularité est-elle calculée? Est-ce que ça va jamais diminuer? La plupart des sujets sont populaires pour (Hipes) et deviennent rapides nouvelles. Pour connaître la popularité actuelle d'un enregistrement, je suggère de garder une colonne supplémentaire popularityonUpdate qui contient la valeur de popularité au moment de la dernière mise à jour. Lorsque la popularité diminue l'incrément de la valeur de la popularité disparaîtra et donc la différence entre la valeur de la popularitéLonUpdate et la valeur de popularité. P>
La requête peut devenir: p>
order by POP_WEIGHT*(popularity - popularityOnUpdate)
+ UPD_WEIGHT*(current date - lastUpdate) DESCENDING
Votre requête est VRAI
SELECT * FROM results ORDER BY last_updated, popularity;
Il existe bien sûr de nombreuses façons de sélectionner une formule pour amener la popularité et last_update ensemble en une seule valeur à commander. Il s'agit donc plus d'un modèle qu'une réponse prête
pour simplement utiliser la popularité, nous pouvons utiliser la fonction aléatoire () pour ajouter un facteur à la popularité p> Pour la date, il est logique de soustraire de la soustraire d'aujourd'hui, puis d'utiliser aléatoire () sur ce résultat, donc si nous ajoutons que P> SELECT *
FROM results
ORDER BY popularity * random() + (current_date - last_updated) * random()
Je pense que cela devrait être last_updated - actuel_date code> plutôt que actuel_date - last_updated code>. Sinon, cela donnera la priorité aux lignes qui viennent de mettre à jour.
@David je pense que vous avez raison. J'ai hiérarchisé récemment mis à jour mais cela devrait probablement être l'inverse. Bien sûr, plutôt que de changer l'ordre de la soustraction, le résultat pourrait être ajouté au lieu de soustrait de la valeur de la popularité.
Une dernière question: est-il possible de rendre la popularité pertinente pour la valeur dans les autres lignes? Ainsi, si une certaine rangée est vraiment populaire (par exemple, une popularité de 1000 tandis que les autres lignes ne disposent que d'environ 0 à 100), il sera toujours au sommet.
@David C'est pourquoi j'ai écrit que c'est plus d'un modèle et qu'il a besoin de plus de travail. Si vous regardez les fonctions mathématiques de PostgreSQL, vous voyez que, par exemple, il existe une fonction journal () et utiliser cette popularité compresserait la plage depuis le journal (1000) est 3 et le journal (100) est 2 et ainsi de suite. Il pourrait y avoir Autres qui sont intéressants.
@David . . . Wow. Je ne parviens pas à ajouter d'ajouter des nombres aléatoires à la popularité fait quelque chose d'utile.
Veuillez indiquer vos échantillons de données et votre sortie attendue pour ces données.
Il n'est pas clair que lance_updated entre en jeu ici, peut-être que cela devrait faire partie d'une situation à la place?
@Joakimdanielson j'ai mis à jour ma question avec quelques informations supplémentaires. Étant donné que je veux m'assurer que toutes les lignes sont régulièrement mises à jour, des lignes qui n'ont pas été mises à jour dans un certain temps devraient avoir une probabilité plus élevée d'être mis à jour. Cependant, je veux aussi que plus de lignes populaires soient mises à jour plus souvent par rapport à moins populaires. Par exemple. Une rangée avec la popularité de 1000 devrait être mise à jour plus souvent qu'une rangée avec la popularité de 1.
Lorsque vous dites mis à jour, vous ne voulez pas dire mis à jour dans la base de données, non? Vous voulez dire rafraîchi sur un UI quelque part?
@CODULIKIKE NON, je veux dire mis à jour dans la base de données. Je mettais régulièrement à jour les lignes pour vous assurer que leurs informations sont à jour (j'ai oublié de poster un exemple de cela dans la description, désolé). Des lignes et des rangées plus populaires qui n'ont pas été mises à jour dans un moment doivent être prioritaires.
C'est possible - d'une zillion de différentes manières. Vous devez spécifier ce que vous voulez que le solde ressemble. Quelle est la relation entre
last_updated code> etpopularité code>? Est-ce que c'est censé être la dernière fois que quelqu'un vote sur une page comme étant "populaire"?@Gordonlinoff Disons que les titres sont analysés à partir d'une page Web tiers. Les titres sont constamment mis à jour afin que la base de données ait besoin de mettre à jour régulièrement ses lignes avec les nouvelles informations. Chaque fois que l'une des lignes est mise à jour, la ligne
last_updatedated code> est définie sur la date actuelle.Popularité CODE> est le nombre de fois qu'une certaine ligne a été demandée. Les lignes populaires devraient être mises à jour plus souvent que des lignes moins populaires, mais en même temps, les lignes moins populaires ne peuvent être complètement ignorées (elles ne devraient pas simplement être mises à jour aussi souvent).