2 votes

Liste triée dans une base de données SQL Server

Je me demandais s'il est possible/bon de maintenir une liste triée dans une base de données.

Par exemple, j'ai une liste d'éléments avec une priorité de 1 à 100. Chaque fois que j'insère un élément, la base de données peut l'insérer à la bonne position, de sorte que lorsque j'appelle .select(20) la base de données peut me renvoyer les 20 premiers éléments ayant la plus haute priorité.

6voto

Conrad Frix Points 34272

Ajouter un champ appelé priorité. Remplissez-le avec des données appropriées et triez-le et, en fonction de votre base de données, sélectionnez les 20 premiers, par ex.

SELECT TOP 20 [Your fields here] 
FROM   table 
ORDER  BY priority 

o

SELECT [Your fields here] 
FROM   table 
ORDER  BY priority 
LIMIT 20

L'ajout d'un index pour le champ serait probablement une bonne idée également.

Il s'agit d'une solution très durable. Toute autre solution tirant parti de l'ordre dans lequel les lignes sont physiquement stockées dans la table serait très fragile.

1voto

onedaywhen Points 24594

Je me demandais si c'était possible/bon. de maintenir une liste triée dans une base de données.

Voir la réponse de @Conrad Frix pour découvrir que c'est effectivement possible (en utilisant la fonction fenêtrée ROW_NUMBER() est une autre approche qui a l'avantage d'être Standard SQL et d'être supportée par SQL Server). Notez que cela ajoute une colonne à une table (un attribut à une relvar, si vous voulez), ce qui n'est pas une "liste triée" mais semble correspondre à ce dont vous avez besoin.

Est-ce une bonne idée ? Il est clair que s'il s'agit d'une exigence de votre application/entreprise, il est effectivement approprié de conserver les valeurs dans la base de données.

A chaque fois que j'insère, la base de données peut l'insérer à la bonne position

Notez que si vous avez 100 rangs avec des numéros uniques, vous ne pouvez pas les modifier. priority valeurs de l'attribut 1-100 et vous devez INSERT une valeur à, disons, priority = 55 Si vous avez besoin de gérer les valeurs existantes 55-100, celles-ci doivent être incrémentées d'une unité et la base de données ne le fera pas pour vous, à moins que vous n'ayez écrit un code procédural dans un objet de la base de données pour le faire (par exemple, un déclencheur). Si vous devez uniquement gérer INSERT (et non UPDATE s ni DELETE ), une meilleure approche consisterait à commencer par des écarts plus importants. Par exemple, vos 100 premières lignes pourraient avoir les valeurs suivantes priority valeurs 1000, 2000, 3000,...100000. Maintenant, le même INSERT comme précédemment peut aller entre 54000 et 55000 en lui attribuant l'attribut priority = 54500 sans qu'il soit nécessaire de réaffecter des valeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X