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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

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

データベース設計

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

Q&A

2回答

707閲覧

【マスタ設計】締切日、所要時間をどう表現・実装するか

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

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

データベース設計

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

0グッド

1クリップ

投稿2018/02/18 21:30

編集2018/02/19 06:13

前提

設計段階なので、提示できるソースコード(作成しているアプリ)はありません。
ただ具体的なイメージを共有したいので、プログラミング言語はPHP、RDBMSはMySQL、サービスはホットペッパービューティーのようなサロン検索サイトを例にしてご質問させていただければと思います。

質問内容

サービスの開発者として、サロンのメニュー毎に予約締切日施術時間を表示する機能を実装することになったとします。各項目の表示要件は下記のように仮定します。

  • 予約締切日(Reservation Deadline)

N日hh:mmまでという表示ができる
表示例) 当日10:00まで、3日前20:00まで

  • 施術時間(Time required)

約N分or約N時間という表示ができる
表示例) 約45分、約2時間

みなさんなら、これらをどのような方針でどのように設計・実装されますでしょうか?

考えてみたこと

方針はいずれかだと考えました。
0. テーブル定義はシンプルにしてプログラムで頑張る。
0. プログラムで頑張らなくても良いようにテーブル定義を工夫する。

上記1の方針では考えてもわからなかったため、上記2の方針で、以下のように考えました。

テーブル定義(イメージ)

SQL

1CREATE TABLE `menu` ( 2 `id` SERIAL, 34 `reservation_deadline_day` INT COMMENT '予約締切日前(例:0)', 5 `reservation_deadline_time` TIME COMMENT '予約締切時間(例:10:00)', 6 `time_required` INT COMMENT '施術時間(例:2)', 7 `time_required_unit` VARCHAR(2) COMMENT '施術時間単位(例:時間)' 8);
プログラム(イメージ)

PHP

1//予約締切日 2$reservation_deadline_day; //DBの値が入っている 3$reservation_deadline_time; //DBの値が入っている 4$view_reservation_deadline//画面表示用 5 6if ($reservation_deadline_day === 0) { 7 $view_reservation_deadline = "当日$reservation_deadline_timeまで" 8} else { 9 $view_reservation_deadline = "$reservation_deadline_day日前$reservation_deadline_timeまで" 10} 11 12//施術時間 13$time_required; //DBの値が入っている 14$time_required_unit; //DBの値が入っている 15$view_time_required //画面表示用 16 17$view_time_required = time_required . $time_required_unit;

しかしながら私としては、1つの項目を表示するのに2カラム要する(例:施術時間=time_required+time_required_unit)というところにいまいちしっくりきていません。
さらに、方針1での実装イメージがわかなかったことから、もっとスマートで良い方法があるのではないかと思い質問させていただきました。

具体的なイメージを共有したいがためにPHPとMySQLで質問しましたが、回答はどんな言語・DBでも構いません。
むしろ、特定言語や特定DBに依存しないかたちで、上記要件を満たすためのベターな考え方を知りたいです。
答えは1つでないことは承知の上ですが、プロフェッショナルなみなさまの考えをいただけますと幸いです。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

施術時間については、分単位で入れておいて、表示時に60分を超えれば時間単位に換算する、というのがスッキリするかと思います。

締切の方は、「○日前」「○営業日前」「○時間前」など、単純な日付処理だけでは行かないと思いますので、コードデータと時間データを別に持たせる形がスッキリするかなと思います。

投稿2018/02/19 00:25

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2018/02/19 06:12 編集

回答ありがとうございます! > 施術時間については、分単位で入れておいて、表示時に60分を超えれば時間単位に換算する、というのがスッキリするかと思います。 なるほどですね!私もスッキリしました! > 締切の方は、「○日前」「○営業日前」「○時間前」など、単純な日付処理だけでは行かないと思いますので、コードデータと時間データを別に持たせる形がスッキリするかなと思います。 営業日前という考え方を失念しておりました。。。 ちなみになんですが、以下認識があっているかご回答をお願いできますでしょうか? 営業日前も考慮しますと以下の3パターンがあると思います。 1.当(N=0)日 hh:mmまで 2.N日前 hh:mmまで 3.N営業日前 hh:mmまで 質問では営業日前を考慮していなかったため「日前」と「営業日前」を区別するカラムを持っておりませんでしたが、単純にここを判別するカラム(コードデータ)を追加するという認識でよろしいでしょうか? <イメージ>※名前は適当です `reservation_deadline_day` INT COMMENT '予約締切日前(例:0)', `reservation_deadline_type` VARCHAR(10) COMMENT '予約締切日タイプ(例:営業日前)', ←追加 `reservation_deadline_time` TIME COMMENT '予約締切時間(例:10:00)',
guest

0

同じSQLでも方言が大きいですから、どのデータベースを使うのかをタグで明示した方が適切なコメントが付き易いです。
DATE型、DATETIME型を使うと便利なことが多いです。

Oracleで

SQL

1SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS' ; 2 3セッションが変更されました。 4 5SQL> SELECT SYSDATE FROM DUAL ; 6 7SYSDATE 8------------------- 92018/02/19 07:46:02 10 111行が選択されました。 12 13SQL> SELECT SYSDATE - 1 AS YESTERDAY, SYSDATE, SYSDATE + 1 AS TOMORROW FROM DUAL ; 14 15YESTERDAY SYSDATE TOMORROW 16------------------- ------------------- ------------------- 172018/02/18 07:46:02 2018/02/19 07:46:02 2018/02/20 07:46:02 18 191行が選択されました。 20 21SQL> SELECT SYSDATE - 1/24 AS ONE_HOUR_AGO, SYSDATE, SYSDATE + 1/24 AS ONE_HOUR_LATER FROM 22DUAL ; 23 24ONE_HOUR_AGO SYSDATE ONE_HOUR_LATER 25------------------- ------------------- ------------------- 262018/02/19 06:46:03 2018/02/19 07:46:03 2018/02/19 08:46:03 27 281行が選択されました。 29 30SQL> SELECT SYSDATE - 1/24/60 AS ONE_MINUTE_AGO, SYSDATE, SYSDATE + 1/24/60 AS ONE_MINUTE_L 31ATER FROM DUAL ; 32 33ONE_MINUTE_AGO SYSDATE ONE_MINUTE_LATER 34------------------- ------------------- ------------------- 352018/02/19 07:45:03 2018/02/19 07:46:03 2018/02/19 07:47:03 36 371行が選択されました。 38 39SQL> SELECT ADD_MONTHS(SYSDATE, -1) AS LAST_MONTH, SYSDATE, ADD_MONTHS(SYSDATE, 1) AS NEXT_ 40MONTH FROM DUAL ; 41 42LAST_MONTH SYSDATE NEXT_MONTH 43------------------- ------------------- ------------------- 442018/01/19 07:46:03 2018/02/19 07:46:03 2018/03/19 07:46:03 45 461行が選択されました。 47 48SQL> SELECT ADD_MONTHS(SYSDATE, -12) AS LAST_YEAR, SYSDATE, ADD_MONTHS(SYSDATE, 12) AS NEXT 49_YEAR FROM DUAL ; 50 51LAST_YEAR SYSDATE NEXT_YEAR 52------------------- ------------------- ------------------- 532017/02/19 07:46:03 2018/02/19 07:46:03 2019/02/19 07:46:03 54 551行が選択されました。 56 57SQL> SELECT MONTHS_BETWEEN(TO_DATE('2000/01/01', 'YYYY/MM/DD'), TO_DATE('2000/02/01', 'YYYY 58/MM/DD')) AS KIKAN FROM DUAL ; 59 60 KIKAN 61--------------------------------------- 62 -1 631行が選択されました。 64 65SQL> SELECT MONTHS_BETWEEN(TO_DATE('2001/02/01', 'YYYY/MM/DD'), TO_DATE('2001/01/01', 'YYYY 66/MM/DD')) AS KIKAN FROM DUAL ; 67 68 KIKAN 69--------------------------------------- 70 1 711行が選択されました。 72 73SQL> SELECT SYSDATE, LAST_DAY(SYSDATE) AS LAST_DAY FROM DUAL ; 74 75SYSDATE LAST_DAY 76------------------- ------------------- 772018/02/19 07:46:03 2018/02/28 07:46:03 78 791行が選択されました。 80 81SQL> SELECT SYSDATE, TRUNC(SYSDATE) AS TRUNCATED FROM DUAL ; 82 83SYSDATE TRUNCATED 84------------------- ------------------- 852018/02/19 07:46:03 2018/02/19 00:00:00 86 871行が選択されました。 88 89SQL> SELECT SYSDATE, LAST_DAY(TRUNC(SYSDATE)) AS LAST_DAY FROM DUAL ; 90 91SYSDATE LAST_DAY 92------------------- ------------------- 932018/02/19 07:46:03 2018/02/28 00:00:00 94 951行が選択されました。 96

投稿2018/02/18 22:53

Orlofsky

総合スコア16415

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

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

退会済みユーザー

退会済みユーザー

2018/02/19 06:13

回答、助言ありがとうございます! MySQLを例に質問したので、MySQLタグを追加しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問