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

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

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

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

データベース設計

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

Q&A

解決済

3回答

493閲覧

DB設計/順番を定義するためのテーブルの表現ができない

sikimori

総合スコア13

データベース

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

データベース設計

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

0グッド

0クリップ

投稿2022/10/04 09:58

編集2022/10/06 20:12

DB初心者です。よろしくお願いします。

前提

担当者の順番を定義するためのgroupテーブルと、personテーブルがあります。

[group] id |order1 |order2 |order3 ------------------------------- 0001 |A |B |C 0002 |C |A |B
[person] id |name |tel |mail ------------------------------- A |yamada |080-xx |xxx@tera.co.jp B |fujita |080-xx |xxx@tera.co.jp C |ito |080-xx |xxx@tera.co.jp

作ってみたER図

イメージ説明

発生している問題

ER図見てわかる通り、
order1~3に対してperson.idが紐づいている事が表現できていません。

初めは order1(person.id) としていましたがしっくりこず(テーブルのカラム名とも一致しなくなる)
この場合の一般的な表現の仕方について、ご教授いただきたくよろしくお願い致します。

テーブル設計(正規化)に問題があるとのご指摘を受けました。

order4以降の追加に対応できないというのは全く持ってそのとおりで、
将来的に柔軟性を持ったテーブル設計を行いたいと考えています。
しかし、どのようなテーブル、カラムにすればよいのか考えてみても思い浮かばず、
ご指導のほどお願い致します。

補足

使用するツールはsqlite3の予定です。

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

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

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

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

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

guest

回答3

0

頂いた回答を元に、複合主キーで中間テーブルを作成しました!

イメージ説明

投稿2022/10/06 11:12

sikimori

総合スコア13

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

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

0

SQLをシンプルにパフォーマンス良く実行できるように、データベースのテーブルは
データベースの正規化 に沿って設計します。
通常第3正規化まで行います。

第1正規化で繰り返しを排除します。order1, order2, order3 は同じ内容の繰り返しになります。往々にしてorder4以降が必要になって現状のテーブル設計は破綻するでしょう。

投稿2022/10/05 03:56

Orlofsky

総合スコア16415

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

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

sikimori

2022/10/05 10:56

回答ありがとうございます! テーブル設計に問題があるとのご指摘、ごもっともだと思います。 リンク先拝見し、正規化について改めて考えて見ましたが、 実際にどのような設計にすればよいのか思い浮かびませんでした。 (perosnにorder_num持たせても競合してしまう…) 初歩的なことかもしれませんが引き続きご鞭撻賜りたく、よろしくお願い致します!
guest

0

ベストアンサー

SQL内に同じテーブルを複数記述できます。区別するためそれぞれ別名(エイリアス)をつけます。
それらのテーブルと結合すればいいでしょう。

sql

1SELECT [group].id AS gid, a.Name as Name1, b.Name as Name2, c.Name as Name3 2FROM 3 [group] INNER JOIN person as a ON [group].order1 = a.id 4 INNER JOIN person as b ON [group].order2 = b.id 5 INNER JOIN person as c ON [group].order3 = c.id;

正規化する場合のテーブル設計の一例

[group]

group_idgroup_name
1あああ
2いいい

[person]

person_idnametelmail
Ayamada080-xxxxx@tera.co.jp
Bfujita080-xxxxx@tera.co.jp
Cito080-xxxxx@tera.co.jp

[group_Menber]

group_idperson_idorder_num
1A1
1B2
1C3
2C1
2A2
2B3

sql

1SELECT 2 group.group_id, 3 person.* 4FROM 5 [group] 6 INNER JOIN group_Menber ON group.group_id = group_Menber.group_id 7 INNER JOIN person ON group_Menber.person_id = person.person_id;

投稿2022/10/04 13:54

編集2022/10/05 12:53
hatena19

総合スコア33620

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

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

sikimori

2022/10/05 10:51

回答ありがとうございます! ただ、今回はテーブル設計に問題があるとのご指摘を受け、設計の見直しを行いたいと思います。 どのような設計にすればよいか、案がございましたらぜひご指導ください!
sikimori

2022/10/06 11:10

テーブルの追記回答ありがとうございます!大変参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問