sql >> データベース >  >> RDS >> Mysql

MySQLのベストプラクティスの質問:IDまたは日付で並べ替えますか?

    ある場合 同じ日付で2つ追加される可能性がある場合は、おそらく次のものが必要になります。

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

    (両方のフィールドの「降順」句に注意してください)。

    ただし、1月が完全であることを確認するために、誰かが1月31日の日付を指定された2月2日の調整エントリを追加したときに何が起こりたいかを考慮する必要があります。 2月1日に作成されたIDよりも大きいIDになります。

    一般的に、会計システムはその日に機能します。おそらく、理由を教えていただければと思います 順序は重要です。他の提案をすることができます。

    コメントへの返信:

    私はいくつかのアドバイスを提供します-これは私がすぐに考えることができるすべてです、私は通常さらに少ない励ましではるかに多くの「アドバイス」を吐き出します:-)最初の2つは、会計関連よりもデータベース関連です:

    まず、すべてを実行します 第3正規形で、パフォーマンスに問題がある場合にのみ元に戻します。これにより、ステップから外れる可能性のある重複データに対する多くの不安を軽減できます。元に戻す場合でも、トリガーやその他のDBMS機能を使用して、データがステップから外れないようにします。

    たとえば、last_name列での検索を高速化したい場合は、upper_last_name列(インデックス付き)を作成し、それを使用して、すでに大文字の検索用語に一致するレコードを見つけることができます。これは、ほとんどの場合、行ごとの関数upper(last_name)よりも高速です。 。挿入/更新トリガーを使用して、upper_last_nameが常に正しく設定されていることを確認できます。これにより、検索するたびではなく、名前が変更された場合にのみコストが発生します。

    次に、同じトリガータイプのトリックを使用してデータがステップから外れないことを保証できない限り、(現在のスキーマのように)テーブル間でもデータを複製しないでください。最終残高が開始残高と購入額の合計と一致しない請求書を顧客に送信すると、顧客はどうしますか?それはあなたの会社を非常にプロフェッショナルに見せることにはなりません:-)

    第三に(そしてこれはより会計関連です)、あなたは一般的にその場で残高を計算するときにトランザクションの数を心配する必要はありません。これは、会計システムには通常、年末に期首残高をリセットするロールオーバー機能があるためです。

    したがって、通常、1年以上のデータを一度に処理する必要はありません。これは、米国政府またはMicrosoftでない限り、それほど面倒ではありません。



    1. SELECT max(x)はnullを返します。どうすれば0を返すことができますか?

    2. プール内のJDBC接続を閉じる

    3. MySQLのFIELD()とFIND_IN_SET()の違い

    4. データ品質とあいまい検索