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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

6回答

241閲覧

RDBMSがよく分からなくなってきました

widget11

総合スコア221

MySQL

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2019/01/18 18:01

イメージ説明

以上のようなテーブルがあったとします。
draw.ioで作った簡易的なテーブルではあるのですが、このt_accountというテーブルにあるDetailIdという属性はt_Detailというテーブルの主キーに紐付いていてこのテーブルは、Height(身長)、Weight(体重)という属性を持っているとします。
この時t_accountとt_Detailの関係性は1対1なのでしょうかそれとも1対多にあたるのでしょうか?
最初はDetailIdは複数のt_detailの属性と紐付けられるから1対多と思っていたのですが、よくよく考えたらこのt_Accountつまりアカウントを持っている人の身長、体重は複数を持てないので1対1なのではないかと感じました。更に考えるとt_accountにHeightとWeight属性を持たせることはできますし。。。

個人的にこの関係性は1対1のリレーションであるとは思うのですが、それを踏まえてわざわざテーブルを2つ作り1対1のリレーションにする理由って何なのでしょうか?1つのテーブルがごちゃごちゃしなくなるくらいにメリットが思いつかないのですが。。。
宜しくお願い致します。

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

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

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

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

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

Orlofsky

2019/01/18 19:10

タイトルはどんなことを質問したいのか、想像できるものに変えてください。
guest

回答6

0

テーブルの名称であるaccountdetailについて考えてみましょう。
account自体は個人が主体ではありません。
和訳しても勘定など計算に関するものが殆どで個人と結びつくようなものではありません。
元々キーを管理するような意味合いです。

detailはそれに対する付加情報で、たまたま体重や身長ということだけだと思います。

身長や体重のように1:1になるものもあれば、1:多になるものもあります。
これらを拡張していくとすれば、軸となるものが必要でそれがaccountということになります。

また、キー同士の関係で1:1になるものでも、利用する機能に合わせて分割する場合もあります。
例えば、個人の様々な情報を入力する複数の画面を考えた時、一つのテーブルとするより画面ごとのテーブルに分割する方が、処理も楽ですしね。

追記

気付いた点について一つ。
t_accountの方にFKとしてdetailidがありますが、この関係だとt_detailの方が先に作成されていないとおかしいことになり、t_detailは身長と体重の組み合わせのパターンテーブルとして既に存在しているという事になります。
なのでその場合の関係は、t_detailt_accountとして1:多ですね。

身長と体重として入力するような場合には、t_detailFKとしてaccountidがあるのが正しい設計だと思います。

投稿2019/01/19 07:13

編集2019/01/19 11:08
sazi

総合スコア25173

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

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

0

ベストアンサー

一対一関係のデータは一つのテーブルにまとめるというのがデータベース設計のセオリーです。
が、例外的に一対一にわける設計をした方がいいケースもあります。
下記辺りを参照。

【DB設計/オブジェクト指向】一対一テーブルを作った方が良いケース【 Rails】 - Qiita

また、一対一関係のテーブル設計なら、通常は主キー同士を結合する設計になります。

text

1T_Account 2------------------- 3PK AccountID

text

1T_Datail 2------------------ 3PK AccountID 4  Height 5  Weight

しかし、提示のテーブル設計は、一対一の設計になっていません。
t_Account で、DetailID が主キーでないということは重複する可能性があるということなので、
t_Detail と t_Account は設計としては、一対多の設計になっているということです。
DetailID にユニーク属性を付加して一対一にするということも考えられますが、
そうならば、AccountID と DetailID と2つのキーを持たせる必然性がありません。

このような設計にしたということは、
t_Account が個人と一対一で結びついたデータでない、つまり、個人が複数のAccountを持つ可能性がある、
あるいは、T_Datail が個人と一対一で結びついたデータでない、
例えば、現時点での身長と体重は一つですか履歴も持たせる、
というような場合が考えられます。

提示のテーブル設計は実際のものではないと思いますので、
実際のデータなしに、実際にはありえないテーブル設計を見せられて、
どうこう議論しても意味はないと思われます。

実際のデータが本当に一対一の関係なのか、確認されてはどうですか。
本当に一対一の関係なら、上のリンク先にことに該当するか確認されればいいでしょう。

投稿2019/01/19 09:54

hatena19

総合スコア33699

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

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

sazi

2019/01/19 10:45

> t_Detail と t_Account は設計としては、一対多の設計になっているということです。 PK accountid , FK detailid ⇒ pk detailid という関係なら、accountid に対して、detaiidという選択肢は持てても、1:多には成り得ませんよ
sazi

2019/01/19 11:18 編集

すいません。上記コメントは誤りです。 FKという視点で考えると1:多ですね。 t_detailが個人を表し、t_accountがログイン情報などを示すものと考えるのもありですね。 名称に惑わされてしまいました。というか関係が正なのか名前が正なのか正直分かりませんが。
hatena19

2019/01/19 11:21

実際のデータなしに何が正しいかを議論しても始まらないということだと思います。 テーブル名やフィールド名も実体を表しているとは思えませんので。
guest

0

アカウント情報には誰でもアクセスできても、
体重や身長といった個人情報には誰でもアクセスさせたくない場合は
それぞれわける意味もあると思います。

投稿2019/01/18 23:22

taketoma

総合スコア374

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

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

0

身長・体重の更新が頻繁に行われる可能性があるのであれば、
テーブルロック等を鑑みて、更新専用のテーブルとして分けているのではないでしょうか。

投稿2019/01/19 04:10

LILI.IRON.FIST

総合スコア151

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

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

0

おっしゃる通り1つにまとめてもよいですが、
身体情報は、プライベートな情報なので、ここでは別テーブルにしている気がします。

アカウントID、パスワード、名前などは、t_accountとして、
そこに、どこまでまとめておくかでしょうか。
郵便番号、住所1,2、電話番号、勤務先など

検診などの場合は、時系列で複数回計測することになるので、
t_detailは、account_id, seq(履歴用にカウントアップ),weight,heightみたいに個人に対して、
複数レコードが発生します。

設計時にどういう目的で使用するかで変わるかと思います。

投稿2019/01/18 19:40

sweeper

総合スコア16

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

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

0

draw.ioは使ったことがありません。
ひとりの人の身長と体重が複数ありうるなんて通常は考えられません。だから、1対多である必要はありません。テーブルを設計した担当者に確認するのがいちばんの近道でしょう。
それが難しいなら、外部キー制約について のように、実際に親テーブルと子テーブルにどんなデータが入っているか、調べてみては?

投稿2019/01/18 19:08

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問