Un besoin courant lors de l'utilisation d'une base de données est d'accéder aux enregistrements dans l'ordre. Par exemple, si j'ai un blog, je veux pouvoir réorganiser mes articles de blog dans un ordre arbitraire. Ces entrées ont souvent beaucoup de relations, donc une base de données relationnelle semble logique.
La solution courante que j'ai vue est d'ajouter une colonne entière order
:
CREATE TABLE AS your_table (id, title, sort_order)
AS VALUES
(0, 'Lorem ipsum', 3),
(1, 'Dolor sit', 2),
(2, 'Amet, consect', 0),
(3, 'Elit fusce', 1);
Ensuite, nous pouvons trier les lignes par order
pour les obtenir dans le bon ordre.
Cependant, cela semble maladroit:
- Si je veux déplacer l'enregistrement 0 au début, je dois réorganiser chaque enregistrement
- Si je veux insérer un nouvel enregistrement au milieu, je dois réorganiser chaque enregistrement après
- Si je veux supprimer un enregistrement, je dois réorganiser chaque enregistrement après
Il est facile d'imaginer des situations comme:
- Deux enregistrements ont le même
order
- Il existe des écarts
order
entre les enregistrements
Cela pourrait se produire assez facilement pour un certain nombre de raisons.
Voici l'approche adoptée par des applications comme Joomla:
Vous pourriez dire que l'interface ici est mauvaise, et qu'au lieu que les humains éditent directement les nombres, ils devraient utiliser des flèches ou glisser-déposer - et vous auriez probablement raison. Mais dans les coulisses, la même chose se produit.
Certaines personnes ont proposé d'utiliser une décimale pour stocker la commande, de sorte que vous pouvez utiliser "2,5" pour insérer un enregistrement entre les enregistrements de l'ordre 2 et 3. Et bien que cela aide un peu, c'est sans doute encore plus compliqué car vous pouvez vous retrouver avec décimales bizarres (où vous arrêtez-vous? 2,75? 2,875? 2,8125?)
Existe-t-il une meilleure façon de stocker la commande dans une table?
orders
et le ddl.