2019/11/21

やあ。 今は茄子と大根と味噌汁と豚の切り落としの唐揚げを作って、プライムリッチとともに胃袋に流し込んでいる最中である。 ちなみに豚の切り落としの唐揚げというのは以下のような料理である。

f:id:tac2nd:20191122120225j:plain

滅茶苦茶体に悪そうである。 肉に対する衣の量が異常に多く大量の油を摂取することができる。 これを味ぽんに生姜とニンニクを溶かした簡単なタレに付けて食べる。 旨すぎるのである。


早速今日も昨日の続きのフロントエンドの作業を進めていく。 と言いたいところだが、一旦その作業はストップし、もう一度テーブルスキーマから見直すこととする。 今日は色々な人たちから刺激を受けて、こういった個人的なプロジェクトでももっと色々吟味しながら開発していかなければ自分のスキル向上には繋がらないなぁと思ったのがその主な動機である。

では、早速テーブルスキーマを再考していく。 全体を考えきってから細かい説明を書き残していくこととする。


できた。

f:id:tac2nd:20191121223142p:plain

Users テーブルは以前に説明したとおりである。 特に説明することはない。

CREATE TABLE IF NOT EXISTS `users` (
  `id` CHAR(36) NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `display_name` VARCHAR(255) NULL,
  `email` VARCHAR(255) NOT NULL,
  `password` VARCHAR(255) NOT NULL,
  `salt` VARCHAR(45) NOT NULL,
  `is_admin` TINYINT(1) NOT NULL,
  `created_at` DATETIME NOT NULL,
  `updated_at` DATETIME NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB

次にルーティンワーク関係のテーブルについて説明する。

以前は週ごとのルーティンワークしか設定出来なかったが、月ごとのルーティンワークを設定したいことも多々あると思われるため、Routines テーブルに継承関係を持たせることにし、共通の設定を Routines テーブルに持たせ、週ごとのルーティンワークの設定を WeeklyRoutines テーブルに、月ごとのルーティンワークの設定を MonthlyRoutines テーブルに持たせることとした。

CREATE TABLE IF NOT EXISTS `routines` (
  `id` CHAR(36) NOT NULL,
  `user_id` CHAR(36) NOT NULL,
  `title` VARCHAR(255) NOT NULL,
  `description` TEXT NULL,
  `status` VARCHAR(16) NOT NULL,
  `start_time` TIME NULL,
  `finish_time` TIME NULL,
  `color` VARCHAR(7) NOT NULL,
  `is_allday` TINYINT(1) NOT NULL,
  `created_at` DATETIME NOT NULL,
  `updated_at` DATETIME NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `user_id`
    FOREIGN KEY ()
    REFERENCES `users` ()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `weekly_routines` (
  `routine_id` CHAR(36) NOT NULL,
  `do_monday` TINYINT(1) NOT NULL,
  `do_tuesday` TINYINT(1) NOT NULL,
  `do_wednesday` TINYINT(1) NOT NULL,
  `do_thursday` TINYINT(1) NOT NULL,
  `do_friday` TINYINT(1) NOT NULL,
  `do_saturday` TINYINT(1) NOT NULL,
  `do_sunday` TINYINT(1) NOT NULL,
  PRIMARY KEY (`routine_id`),
  CONSTRAINT `routine_id`
    FOREIGN KEY ()
    REFERENCES `routines` ()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `monthly_routines` (
  `routine_id` CHAR(36) NOT NULL,
  `times` INT NOT NULL,
  PRIMARY KEY (`routine_id`),
  CONSTRAINT `routine_id`
    FOREIGN KEY ()
    REFERENCES `routines` ()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

RoutineHistories テーブルは以前のものと同じである。 ただし、Routines テーブルの変更履歴を保存するための RoutineEventHistories テーブルは削除することとした。 正直変更履歴を管理し続けるというのは中々厳しいものがあるし、ルーティンワークの条件を変更したい場合は元々の Routines テーブルの行をInactivateして、他の行をInsertするだけでよいと判断したのが主な理由である。

CREATE TABLE IF NOT EXISTS `routine_histories` (
  `routine_id` CHAR(36) NOT NULL,
  `date` DATE NOT NULL,
  `done` TINYINT(1) NULL,
  PRIMARY KEY (`routine_id`, `date`),
  CONSTRAINT `routine_id`
    FOREIGN KEY ()
    REFERENCES `routines` ()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

最後に日記関係のテーブルであるが、正直これも前と同じように大した説明は必要ないと思われる。 日記に対するコメントを管理するための DiaryComments テーブルと、日記に対するリアクション(「いいね」的なもの)を管理するための DiaryReactions テーブルを追加したのと、その日記の可視性を管理するための visiblity フィールドを Diaries テーブルに追加したくらいである。

CREATE TABLE IF NOT EXISTS `diaries` (
  `id` CHAR(36) NOT NULL,
  `user_id` CHAR(36) NOT NULL,
  `date` DATE NOT NULL,
  `content` TEXT NOT NULL,
  `visiblity` VARCHAR(16) NOT NULL,
  `created_at` DATETIME NOT NULL,
  `updated_at` DATETIME NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `user_id`
    FOREIGN KEY ()
    REFERENCES `users` ()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `diary_comments` (
  `id` CHAR(36) NOT NULL,
  `diary_id` CHAR(36) NOT NULL,
  `user_id` CHAR(36) NOT NULL,
  `content` TEXT NOT NULL,
  `created_at` DATETIME NOT NULL,
  `updated_at` DATETIME NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `diary_id`
    FOREIGN KEY ()
    REFERENCES `diaries` ()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `user_id`
    FOREIGN KEY ()
    REFERENCES `users` ()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `diary_reactions` (
  `diary_id` CHAR(36) NOT NULL,
  `user_id` CHAR(36) NOT NULL,
  `reaction` VARCHAR(16) NOT NULL,
  PRIMARY KEY (`diary_id`, `user_id`),
  CONSTRAINT `diary_id`
    FOREIGN KEY ()
    REFERENCES `diaries` ()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `user_id`
    FOREIGN KEY ()
    REFERENCES `users` ()
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

よし出来上がった! いよいよフロントの開発に取り組める、というところで今日は疲労困憊なのでここまでとする。

続きは明日。