日時は1つの値です
日時の値は、ほとんどの場合、ソフトウェアで単一の値として追跡されます。技術的には、エポック以降、内部では秒/ミリ秒/マイクロ秒/ナノ秒のカウントとして表されます。 。
日付と時刻をユーザーインターフェースで別々に表示したい場合がありますが、内部では表示したくない場合があります。
また、ほぼ確実にタイムゾーンについて考える必要があります。ナイーブなプログラマーは、タイムゾーンを無視できると考えることがよくありますが、それが後で苦痛を引き起こすことはほぼ確実です。
データベースの日時の処理を理解する
データベースが異なれば、日時の処理も異なります。ドキュメントを読み、遊んで、実験して、データベースがどのように機能するかを正確に学ぶことが絶対に重要です。
Postgres
日時の優れた賢明な処理があります。別のデータベースを使用している場合でも、date-に関する優れたPostgresドキュメントを参照してください。時間データ型
および
グローバルに保存、ローカルに表示
日時は驚くほど滑りやすく複雑な問題です。問題を把握するための1つの鍵は、UTC で作業することです。 。日時値をデータベース(またはシリアル化されたファイル、またはXML / JSON通信)にUTCで保存します。 「新しい日の始まり」の定義など、ローカルタイムゾーンが重要な場合を除いて、ほとんどのビジネスロジックをUTCで記述します。
ユーザーに提示するときは、ISO 8601形式を使用するか、独自のタイムゾーン(またはユーザーが期待するタイムゾーン)にローカライズします。これは、国際化/ローカリゼーションの基本的な考え方に従います。テキスト値の場合、コードで特定のキー文字列を使用します。ユーザーインターフェイスに表示されたら、それらの内部文字列をユーザーインターフェイスのローカライズされた(変換された)テキスト値にマップします。日時のあるもの:内部的にUTC、ユーザーインターフェースのローカルタイムゾーン。
注意点:また 履歴のためにローカル日時を保存します。タイムゾーンのルールは、政治家や官僚のために頻繁かつ気まぐれに変更されます。ソフトウェアのタイムゾーンデータベースが古くなっている可能性があります。そのため、自分またはユーザーが特定の日時であると信じているものを保存したい場合があります 。しかし、それに依存しないでください。 UTC値を決定して保存します。
ヒント:24時間制で考えて読むことを学びます。プログラマー/デバッガー/システム管理者としてのあなたの生活は、はるかに簡単になり、エラーが発生しにくくなります。
Joda-Timeまたはjava.time
Javaにバンドルされているjava.util.Dateクラスと.Calendarクラスは、厄介なことで有名です。それらを避けてください。
代わりに、Joda-Time のいずれかを使用してください または、新しいjava.timeパッケージ Java 8に組み込まれています(Joda-Timeに触発され、JSR 310によって定義されています)。
どちらのライブラリも、文字列の解析と生成の両方で、デフォルトとしてISO8601形式を使用しています。
ISO 8601
ISO 8601 は、日時の値、タイムゾーンとオフセット、期間、および期間を特定の明確なテキスト形式で表示する方法を定義する賢明な標準です。そのよく書かれたウィキペディアのページを調べてください。
特に、標準で期間
と呼ばれていることに注意してください。 。期間は次の形式で定義されます:PnYnMnDTnHnMnS
ここで、P
「期間」を意味し、T
日付部分を時間部分から分離し、他のオプション部分は数字+文字です。 30分の予定はPT30M
。これは、私の ERD
下。 Joda-Timeでは、Periodクラスは、月、日、時間などを追跡することによって期間を表し、この形式で文字列を解析および生成する方法を知っています。
ハーフオープン
2つの方法のいずれかで予定を保存することを選択できます。 1つの方法は、開始日時と期間(90分、20分など)です。もう1つの方法は、開始日時と終了日時の両方を記録することです。この場合、通常の一般的に最良のアプローチは「ハーフオープン」と呼ばれます。これは、最初が包括的であることを意味します エンディングは排他的ですが 。
たとえば、その時間の1時間の予定は、11:00から12:00まで実行されます。これは、「午前11時に開始し、次の時間の最初の瞬間(正午)まで実行する」ことを意味します。次の予定は12:00から13:00まで実行されます。
StackOverflowで「Half-open」を検索して、その他のディスカッション、例、図を見つけてください。
多対多
患者との関係 および医師 これは、私たちが多対多 と呼んでいるものです。 。医師は多くの患者を診察し、患者は複数の医師を診察する場合があります。リレーショナルデータベースの設計における多対多のテーブルについて知っていることを確認してください。解決策は常に、他の両方の親テーブルの子テーブルとして機能する「ブリッジ」テーブルと呼ばれることもある3番目のテーブルを追加することです。あなたの場合、予定 テーブルはブリッジテーブルです。
多対多の関係で結合を実行する方法を知っておく必要があります。
直接SQL
プログラミングやリレーショナルデータベースを初めて使用する場合は、Hibernateを避けることをお勧めします。あなたは本当に何が起こっているのかを把握する必要があります。 Hibernateにはいくつかの適切な用途があります。しかし、Hibernateが魔法のようにデータベースの問題を解消しようとしていると思うなら、あなたはがっかりするでしょう。
属性
属性はあなた次第です。それらはあなたが解決しようとしているビジネス(または宿題?)の問題に依存します。あなたには基本的な権利があります。
予定のスケジューリングは、ソフトウェアを作成する上で非常に難しいビジネス上の問題です。たとえば、単に予定が作成されていることを記録していますか?または、事前定義されたタイムスロットを作成して、医師の空き状況を追跡していますか?その場合、各医師のカレンダーの例外と変更をどのように処理しますか?非常に具体的な要件とユースケースを作成する必要があります。ユーザーの期待が想定される要件を超えるのは非常に簡単です。
これが単純なビューです。