12
votes

Meilleure pratique Question pour MySQL: Commandez par ID ou Date?

C'est une sorte de question noobish, mais c'est une réponse qui n'a jamais reçu une réponse directe sur.

Supposons que j'ai une table de base de données avec les champs et valeurs suivants: xxx


Ceci est pour un sous-système de «comptabilité» très basique. Je veux obtenir le plus récent équilibre. Le champ ID est défini sur Auto_Increment. En règle générale, j'utiliserais:

Sélectionnez le solde de My_TABLE COMMANDE par date_Added Desc Limite 1;

mais je dois faire que la valeur renvoyée est la plus récente ... (voir id n ° 2 et 3 ci-dessus)

1) Est-ce que je serais mieux à utiliser:

Sélectionner un solde De my_table commande par ID de descente de la limite 1;

2) ou serait-ce une meilleure solution ?:

Sélectionnez Solde à partir de My_Table par date_added, ID Limite de descente 1;


Afaik, auto_incrènement fonctionne assez bien, mais est-ce assez fiable pour trier quelque chose de ce crucial? C'est pourquoi je pense que le tri par les deux domaines est une meilleure idée, mais j'ai vu un comportement vraiment bizarre dans MySQL quand je l'ai fait dans le passé. Ou s'il y a une solution encore meilleure, j'apprécierais votre contribution.


Merci d'avance!

brian


0 commentaires

3 Réponses :


2
votes

Personnellement, je ne ferais jamais confiance à un autocrament de cette façon. Je trierais à la date.

Je suis sûr que l'ID est garanti d'être unique, mais pas nécessairement séquentiel et croissant.


1 commentaires

L'incrément automatique MySQL n'entrera jamais un nombre inférieur au dernier numéro inséré. C'est un numéro de sécurité à compter si vous souhaitez la dernière transaction dans la base de données.



10
votes

S'il y a est em> une chance que vous obtiendrez deux ajoutés à la même date, vous aurez probablement besoin de:

SELECT balance FROM my_table ORDER BY date_added DESC,id DESC LIMIT 1;


5 commentaires

Merci Pax! Il y a en fait un champ que j'ai laissé de côté de la table et c'est l'user_id. Nous avons un système de «crédit» que nos utilisateurs peuvent utiliser pour acheter des biens ou des services et nous gardons un total de leurs soldes dans ce tableau. Pour obtenir leur «solde actuel», je souhaite sélectionner le solde le plus récent de cette table. La table ci-dessus est mise à jour à tout moment une transaction est faite. (Les transactions sont toutes stockées dans une table séparée). J'espère que cela a eu sens, lol.


Hmm, ce n'est pas la façon dont je le ferais, mais à chacun leur propre :-) Je calculerais soit le solde basé sur toutes leurs entrées de transaction (ma préférence, car il y a nul chance des données obtenues hors de l'étape entre les deux tables), ou entretenez simplement un enregistrement un pour chaque utilisateur avec le solde actuel et la mise à jour. En fait, je ne peux pas me faire recommander cette deuxième option maintenant que j'y pense. Vous devez faire attention à votre solution actuelle aussi bien que vous détenez des données dans deux endroits différents pouvant être en désaccord les uns avec les autres.


Eh bien, nous voudrions conserver l'équilibre des antécédents si pour rien d'autre, mais à des fins de rapport internes. J'avais effectivement réfléchi à votre idée de calculer toutes les transactions également, mais j'ai compris la voie ci-dessus pourrait être plus facile. Peut-être que je vais repenser cette idée. ;) J'aimerais bien entendre des idées ou des conseils que vous pourriez avoir, même s'ils sont hors tension, car j'ai une connaissance de zéro des modèles de base de données de type comptable. ;) Merci encore!


Conseil génial! Je n'avais même pas pensé à certains de ces points que vous venez de faire. Merci beaucoup. Je pense que je vais faire certains de ces changements en ce moment. ;)


Que diriez-vous du tri uniquement par ID au lieu d'horodatage, est-ce dangereux?



3
votes

Peut-être est plus rapide par ID, mais plus sûr par datetime; Utilisez ce dernier si vous avez des problèmes de performance ajoutez un index.


0 commentaires