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

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

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

MQL(Meta Quotes Language)は、Meta Trader4(MT4)で用いられるプログラミング用語です。MQLによりEAやインジケーターの作成が可能。C言語で書かれているため、C言語の知識があれば簡単に扱うことができます。

Q&A

0回答

711閲覧

DB設計に関するして中間テーブルを親にする設計についてご教授ください。

m3304017499

総合スコア5

MQL

MQL(Meta Quotes Language)は、Meta Trader4(MT4)で用いられるプログラミング用語です。MQLによりEAやインジケーターの作成が可能。C言語で書かれているため、C言語の知識があれば簡単に扱うことができます。

0グッド

0クリップ

投稿2019/11/22 02:55

編集2019/11/22 05:55

前提・実現したいこと

company = 会社 year = 年度 department = 部署 user = 社員 company 1:N year year 1:N department department 1:N user company < year < department < user 条件として ① departmentの名前は変更されても過去のyearの部署名は変更されないこと ② yearでdepartmentを引き継いだ場合departmentは同じものとして扱うこと ③ userの情報はyearごとに管理できること、 (名前、生年月日はyearごとに管理しない) ④ yearごとに表示されるユーザーを表示すること。 上記の条件でDB設計をしております。

発生している問題・エラーメッセージ

yearとuserの中間テーブルであるyearuserからdepartmentとyearuserで作る中間テーブル(departmentuser)は DB設計上いかがなものなのでしょうか?

テーブル設計内容

① departmentの名前は変更されても過去のyearの部署名は変更されないこと   → departmentにdepartment_nameでその当時の名前を保存するように設計 ② yearでdepartmentを引き継いだ場合departmentは同じものとして扱うこと   → departmentを親にdepartmentgroupで名前変更されても同じものに判別するよう設計 ③ userの情報はyearごとに管理できること、 (名前、生年月日はyearごとに管理しない)   → yearuserでその年のuser情報を保存するように設計 ④ yearごとに表示されるユーザーを表示すること。   → yearuserでユーザー取得できるように設計

該当のソースコード

sql

1 2SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 3SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 4SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 5 6-- ----------------------------------------------------- 7-- Schema mydb 8-- ----------------------------------------------------- 9 10-- ----------------------------------------------------- 11-- Schema mydb 12-- ----------------------------------------------------- 13CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ; 14USE `mydb` ; 15 16-- ----------------------------------------------------- 17-- Table `mydb`.`company` 18-- ----------------------------------------------------- 19CREATE TABLE IF NOT EXISTS `mydb`.`company` ( 20 `id` int NOT NULL, 21 `name` VARCHAR(45) NULL, 22 PRIMARY KEY (`id`)); 23 24 25-- ----------------------------------------------------- 26-- Table `mydb`.`year` 27-- ----------------------------------------------------- 28CREATE TABLE IF NOT EXISTS `mydb`.`year` ( 29 `id` int NOT NULL, 30 `name` VARCHAR(45) NULL, 31 `company_id` int NOT NULL, 32 PRIMARY KEY (`id`), 33 INDEX `fk_year_company1_idx` (`company_id` ASC), 34 CONSTRAINT `fk_year_company1` 35 FOREIGN KEY (`company_id`) 36 REFERENCES `mydb`.`company` (`id`) 37 ON DELETE NO ACTION 38 ON UPDATE NO ACTION); 39 40 41-- ----------------------------------------------------- 42-- Table `mydb`.`department` 43-- ----------------------------------------------------- 44CREATE TABLE IF NOT EXISTS `mydb`.`department` ( 45 `id` int NOT NULL, 46 `year_id` int NOT NULL, 47 PRIMARY KEY (`id`), 48 INDEX `fk_department_year1_idx` (`year_id` ASC), 49 CONSTRAINT `fk_department_year10` 50 FOREIGN KEY (`year_id`) 51 REFERENCES `mydb`.`year` (`id`) 52 ON DELETE NO ACTION 53 ON UPDATE NO ACTION); 54 55 56-- ----------------------------------------------------- 57-- Table `mydb`.`departmentgroup` 58-- ----------------------------------------------------- 59CREATE TABLE IF NOT EXISTS `mydb`.`departmentgroup` ( 60 `id` int NOT NULL, 61 `department_name` VARCHAR(45) NULL, 62 `department_id` int NOT NULL, 63 PRIMARY KEY (`id`), 64 INDEX `fk_department_department1_idx` (`department_id` ASC), 65 CONSTRAINT `fk_department_department1` 66 FOREIGN KEY (`department_id`) 67 REFERENCES `mydb`.`department` (`id`) 68 ON DELETE NO ACTION 69 ON UPDATE NO ACTION); 70 71 72-- ----------------------------------------------------- 73-- Table `mydb`.`user` 74-- ----------------------------------------------------- 75CREATE TABLE IF NOT EXISTS `mydb`.`user` ( 76 `id` int NOT NULL, 77 `name` VARCHAR(45) NOT NULL, 78 `birthday` DATE NOT NULL, 79 `company_id` int NOT NULL, 80 `gender` INT NOT NULL, 81 PRIMARY KEY (`id`), 82 INDEX `fk_user_company_idx` (`company_id` ASC), 83 CONSTRAINT `fk_user_company` 84 FOREIGN KEY (`company_id`) 85 REFERENCES `mydb`.`company` (`id`) 86 ON DELETE NO ACTION 87 ON UPDATE NO ACTION); 88 89 90-- ----------------------------------------------------- 91-- Table `mydb`.`yearuser` 92-- ----------------------------------------------------- 93CREATE TABLE IF NOT EXISTS `mydb`.`yearuser` ( 94 `id` int NOT NULL, 95 `user_id` int NOT NULL, 96 `year_id` int NOT NULL, 97 `address` VARCHAR(45) NULL, 98 `email` VARCHAR(45) NULL, 99 `zip` VARCHAR(45) NULL, 100 `tel` VARCHAR(45) NULL, 101 PRIMARY KEY (`id`), 102 INDEX `fk_yearuser_user1_idx` (`user_id` ASC), 103 INDEX `fk_yearuser_year1_idx` (`year_id` ASC), 104 CONSTRAINT `fk_yearuser_user1` 105 FOREIGN KEY (`user_id`) 106 REFERENCES `mydb`.`user` (`id`) 107 ON DELETE NO ACTION 108 ON UPDATE NO ACTION, 109 CONSTRAINT `fk_yearuser_year1` 110 FOREIGN KEY (`year_id`) 111 REFERENCES `mydb`.`year` (`id`) 112 ON DELETE NO ACTION 113 ON UPDATE NO ACTION); 114 115 116-- ----------------------------------------------------- 117-- Table `mydb`.`departmentuser` 118-- ----------------------------------------------------- 119CREATE TABLE IF NOT EXISTS `mydb`.`departmentuser` ( 120 `id` int NOT NULL, 121 `yearuser_id` int NOT NULL, 122 `department_id` int NOT NULL, 123 PRIMARY KEY (`id`), 124 INDEX `fk_departmentuser_yearuser1_idx` (`yearuser_id` ASC), 125 INDEX `fk_departmentuser_department1_idx` (`department_id` ASC), 126 CONSTRAINT `fk_departmentuser_yearuser1` 127 FOREIGN KEY (`yearuser_id`) 128 REFERENCES `mydb`.`yearuser` (`id`) 129 ON DELETE NO ACTION 130 ON UPDATE NO ACTION, 131 CONSTRAINT `fk_departmentuser_department1` 132 FOREIGN KEY (`department_id`) 133 REFERENCES `mydb`.`departmentgroup` (`id`) 134 ON DELETE NO ACTION 135 ON UPDATE NO ACTION); 136 137 138SET SQL_MODE=@OLD_SQL_MODE; 139SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; 140SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; 141 142

ご教授いただきたいです。

SQL更新いたしました。

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

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

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

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

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

coco_bauer

2019/11/22 03:12

「company < year < department < user」というのは、何を表しているのでしょうか? 兼務 ("user 1:N department"と表すのかな?)は有るのでしょうか? 「yearでdepartmentを引き継いだ場合」というのは、具体的に何を表しているのでしょうか? 「departmentは同じものとして扱うこと」ということは、見た目には異なるdepartmentが存在する可能性が有り、それらを同じものとして扱うためのルールがあるという事でしょうか? 何のために(どのような用途で)、どういう機能を果たすようなDBを設計しているのかというイメージが掴みかねます。
yambejp

2019/11/22 03:15

idとか***_idカラムが型指定されていないようですが
m3304017499

2019/11/22 03:24

idとか***_idカラムが型指定されていないようですが この件修正しましたのでおねがいいたします。
m3304017499

2019/11/22 03:30

「company < year < department < user」というのは、何を表しているのでしょうか? company 1:N year year 1:N department department 1:N user 上記を指しております。 兼務 ("user 1:N department"と表すのかな?)は有るのでしょうか? はい。 複数の部署(department)に属す可能性はあります。 そのためdepartmentuserを作成しています。 「yearでdepartmentを引き継いだ場合」というのは、具体的に何を表しているのでしょうか? 毎年新しいyearを作成するときにその年の部署名(departmentgroupのdepartment_name)を引き継ぐ想定でいます。 「departmentは同じものとして扱うこと」ということは、見た目には異なるdepartmentが存在する可能性が有り、それらを同じものとして扱うためのルールがあるという事でしょうか? そのような認識であっております。 名前変更されたとしても 2020の部署名A 2021の部署名A =>部署名B 同じものとして扱いたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問