質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

3回答

12223閲覧

カレンダーのDB設計について

2_34_koki

総合スコア67

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/08/15 01:15

現在,Googleカレンダーのような機能のあるカレンダーをスクラッチで作ろうと思っているのですが,カレンダーのDB設計について質問なのですが,やはりカレンダーテーブルみたいな曜日を管理するテーブルが必要なのでしょうか?
カレンダーテーブルとは年,月,日,曜日を持ったテーブルです.
これを用意していおけば,ユーザの予定等を作成するときに中間テーブルを作ってしまえば簡単に予定を管理できると思ったのが
理由です.実際にカレンダーのページネーション等はクラアント側で実装するので,初回にデータをfetchしてきてそのあと,filterをかければ各月の予定を制御できると思いました.
DB設計については素人なので,アドバイスをいただけたらと思います.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

カレンダーのDB設計について質問なのですが,やはりカレンダーテーブルみたいな曜日を管理するテーブルが必要なのでしょうか?

曜日を管理するだけであれば、
ほぼすべてのプログラミング言語で日付から曜日を計算することがか可能なので
曜日をテーブルで持つ必要はありません

ただし、曜日に関連付けたなんらかの情報を持たせたい場合 (たとえばカレンダーに表示するときの色など)
曜日のマスターテーブルを用意するケースがあります

また、祝日や組織の予定 (会社の休日など) は
別途テーブルを用意する必要に迫られることが多いです
完全に法則に従って与えられる予定ははプログラムで計算することもできますが、
そうでない場合はアプリケーションの動作に必要な未来の予定を
管理者が登録し続ける必要があります

僕がサービスの運用を行っていたときは
次のサイトから定期的にシステムに未来の祝日を登録していました
国民の祝日について - 内閣府

投稿2020/08/15 01:38

y_shinoda

総合スコア3272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

やはりカレンダーテーブルみたいな曜日を管理するテーブルが必要なのでしょうか?

必要かと言われると、仰るように他のテーブルと結合する駆動表として利用できるのであれば有用ですね。

ただ、それを実体を持つテーブルにすると保守が必要になるので、動的に生成されるものにするのが良いかと思います。

カレンダーテーブルを動的に生成する方法はDBMSにより異なります。
ポイントは連番行をどのようにして生成するかです。
(お薦めはpostgresのGENERATE_SERIESです)

DBMSの選定がまだなら、こういった扱いやすさなども考慮しておいた方が良いかと思います。

投稿2020/08/15 04:46

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Oracle Database ですと以下のようにDATE型から曜日を取得しますから、曜日列は使いません。

SQL

1SQL> COLUMN DOMESTIC FORMAT A23 2SQL> COLUMN ENGLISH FORMAT A26 3SQL> SELECT 4 2 TO_CHAR(B.DATES, 'YYYY/MM/DD DY DAY D') AS DOMESTIC 5 3 , TO_CHAR(B.DATES, 'DAY dy day D', 'NLS_DATE_LANGUAGE=AMERICAN') AS ENGLISH 6 4 FROM( 7 5 SELECT 8 6 DATE_FROM + ROWNUM - 1 AS DATES 9 7 FROM( 10 8 SELECT 11 9 SYSDATE - 5 AS DATE_FROM 12 10 , SYSDATE + 5 AS DATE_TO 13 11 FROM DUAL 14 12 ) A 15 13 CONNECT BY LEVEL <= A.DATE_TO - A.DATE_FROM + 1 16 14 ) B ; 17 18DOMESTIC ENGLISH 19----------------------- -------------------------- 202020/08/10 月 月曜日 2 MONDAY mon monday 2 212020/08/11 火 火曜日 3 TUESDAY tue tuesday 3 222020/08/12 水 水曜日 4 WEDNESDAY wed wednesday 4 232020/08/13 木 木曜日 5 THURSDAY thu thursday 5 242020/08/14 金 金曜日 6 FRIDAY fri friday 6 252020/08/15 土 土曜日 7 SATURDAY sat saturday 7 262020/08/16 日 日曜日 1 SUNDAY sun sunday 1 272020/08/17 月 月曜日 2 MONDAY mon monday 2 282020/08/18 火 火曜日 3 TUESDAY tue tuesday 3 292020/08/19 水 水曜日 4 WEDNESDAY wed wednesday 4 302020/08/20 木 木曜日 5 THURSDAY thu thursday 5 31 3211行が選択されました。 33 34SQL>

「申込みから何営業日」といった情報が必要な場合はカレンダーで休日テーブルを用意します。

投稿2020/08/15 03:23

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

2_34_koki

2020/08/15 03:27

曜日が必要ない点理解できました!!! カレンダーテーブルは単位日あたり1レコードのテーブルで作成して大丈夫ですか? カレンダーを作成する上で,レコード数が365日 × n になると思うのですが,どうでしょう?
Orlofsky

2020/08/15 05:41

休日データしか持たないお客様と365日のデータに休日statusを持っているお客様の両方を経験しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問