88114
初投稿です。  
テーブルを設計したのですが、シンプルでなく使いづらいと指摘されました。みなさんが思う最適解を聞かせて頂きたいです。

元データがあまり綺麗でないのですが、以下のようなデータです。  
[![元データ](https://i.stack.imgur.com/P263M.png)](https://i.stack.imgur.com/P263M.png)

1つの診断に対して、病名が複数選択されていて、さらにその病名に対して薬の検査をしています。  
そこで私は、まず診断と病名が多対多なので中間テーブルを作成し、病名が複数選択されている状態を再現しました。  
さらに病名と薬も多対多なので中間テーブルを作成、そこに検査結果(+or-)を登録しました。

[![私の設計](https://i.stack.imgur.com/D88PE.png)](https://i.stack.imgur.com/D88PE.png)

軽く目を通して頂いた上司からは、FKが乗っているテーブルからなら全部取り出せるのになんか複雑だね、と言われました。  
今の設計でも中間2からなら全て取り出せるのかな？と思いつつ考え直しました。  
そこで自分なりに考えた結果、中間テーブルが1つ余分なのかなと思い、以下の状態になりました。

[![修正後](https://i.stack.imgur.com/zu36l.png)](https://i.stack.imgur.com/zu36l.png)

これでこの中間テーブルから取り出せば、余計なテーブルを経由することなく取り出せるのかなと思います。  
ですがあまり使いやすくなった気はしません。

質問が下手ですみません。どう設計するのがベストだったのでしょうか。  
上司は他の範囲を担当しており、新人の私一人で担当している状況です。駄目だ、と言われて何が駄目なのか分からないので困っております。ご助力よろしくお願いします。

**\-- 追記 --**  
1.診断と病気は一対多ではないか。  
書き忘れましたが、病名と薬はマスタ化されており、別テーブルです。  
ですので病名側から見ると、複数の診断に使用されているので、一対多ではなく多対多なのかな(?)と考えています。

２.要件に沿っているか。  
要件に沿っているかが重要なんですね。なるほどです。  
取り出し方についてですが、日付範囲で取り出してあとは画面でユーザーに選択してもらうことを想定しています。どちらの方法が取り出しやすいか、正直実際に取り出してみないと判断できそうにありません。  
nullについて失念していました。初期の設計だと薬がnullになることはあり得なかったのですが、今の状態だと入りますね。一応nullは許容して以下のような状態を想像しています。  
[![null追加](https://i.stack.imgur.com/OK0b4.png)](https://i.stack.imgur.com/OK0b4.png)  
FKにnullは極力避けたいのですが、先輩は良しと言っていました。問題ないと思いますが、また相談したいと思います。

みなさん、回答ありがとうございます。励みになります。
CC BY-SA 4.0
2022-03-31T00:45:46.533
88112
2022-03-31T08:42:37.520
2022-03-31T08:42:37.520
52019
52019
question
データベース設計
中間テーブルを含む設計における、取り出しやすさについて。
エクセルの1行が診断テーブルの1レコードに該当ならば、1回の診断で複数名が受診することはないと思います。  
また、薬検査対象は1つの病気に対して複数の薬を検査しているので、`診断`、`病気`、`薬`テーブルは下記のように **1対多** の関係になりませんか？

`診断` 1..* `病気`  
`病気` 1..* `薬`

もしそうであれば中間テーブルをなくして `診断` 1..* `病気` 1..* `薬` のように結合するテーブル設計をします。

```

    create table 診断 (
    診断ID PK,
    日付,
    患者);
    /
    create table 病気 (
    病気ID PK,
    診断ID FK,
    病名);
    /
    create table 薬 (
    病気ID PK,
    薬ID FK,
    薬名,
    検査結果);
    
```

私が読み間違えていて本当に多対多ならば、 @keitaro_so さんのコメントを参考に質問を追記するとより的確な回答を得やすいです。

さてどう設計するのがベストなのか別解を申し上げますと、「この質問の設計案を上司に持って行ってもう一度直談判しながら設計する」です。  
上司はアドバイスの中で何らかの正解を持っているようですので、現在の対案を説明しつつ、「FKが乗っているテーブルに収めようと試みましたが○○のケースはできないのですが」などの反例や疑問点をまとめて質問しましょう。

「範囲が違うから新人一人で全部考えろ。上司に質問しては駄目だ」という状況ならばそれは体制が駄目ですし、上司が「とにかく駄目だ。質問するなやり直せ」という状況ならばそれは上司が…。  
ということで、QAサイトではすべての要件を説明するのが難しいと思いますので、あとは時間を調整して上司/先輩にトライすることを私はおすすめします。  
かなり悩みに悩んだ上で丁寧に図示してスタックオーバーフローに質問してくださっているので、この内容でそのまま上司に質問して大丈夫ですよと背中を押せます。  
がんばってください。
CC BY-SA 4.0
2022-03-31T01:53:24.437
88114
2022-03-31T01:53:24.437
9820
88112
answer