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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

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

データベース設計

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

Q&A

解決済

6回答

345閲覧

データベースでAとBの関連性を表現するときの設計

makkuro

総合スコア57

MySQL

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

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

データベース設計

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

0グッド

0クリップ

投稿2020/02/20 03:58

peopleというテーブルがあったときに、Aliceさんに関連する人物としてBobさんとCharlieさんがいるということを表現したい場合、以下のようにすればいいのではないかと思いました。

イメージ説明

でもこれだと、Bobさんに関連する人物としてAliceさんが登録できるので、データが冗長になってしまいます。うまく表現する方法があれば教えてください。

環境はMySQLで実現したいです。

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

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

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

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

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

maisumakun

2020/02/20 04:05

フォロー/フォロワーのような向きはない、ということで間違いないですか?
makkuro

2020/02/20 08:52

はい、間違いないです。向きがあれば上記のような設計で可能(冗長にならない)のはわかるのですが、向きがない場合に冗長でない設計があるのか知りたいです。
guest

回答6

0

お望みの要件を網羅するかはわかりませんが、「関連する」を事象として関連IDを振るのはどうでしょうか?会社関連とか、飲み友とか、それぞれの関連IDにpeopleIDを付けたジャンクションテーブルを作成するです。

投稿2020/02/20 07:14

amura

総合スコア333

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

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

0

考え方だけの問題です。
・RDBで表現する多対多自己結合の最小モデルにはフォロー/フォロワーのように方向性がある。
・方向性を無くすにはひと手間必要。
ってことです。

投稿2020/02/20 07:13

hihijiji

総合スコア4150

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

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

0

構造を簡単にするだけならvarcharにしてidをカンマ区切りで保持し
find_in_setなどで検索する手はあります
しかし効率的な検索はできないのでおすすめできません。

投稿2020/02/20 05:40

yambejp

総合スコア114779

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

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

0

Oracle SQL勉強用ユーザー作成スクリプト ですが、

EMP 従業員テーブルに EMPNO 従業員NO, MGR マネージャー

で上司やさらにその上の上司を調べるSQLを書くという、[関連する人物]の勉強ができます。
再帰呼び出しもあるのでお試し下さい。

VARCHAR2型はOracle独自の可変長文字列用のデータ型なのでVARCHAR型に直すなどの必要があります。

投稿2020/02/20 05:03

Orlofsky

総合スコア16415

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

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

0

ベストアンサー

AliceとBobさんの関係が(Alice,Bob)があったとして(Bob, Alice)が登録できるので冗長だという事ですね。

冗長なのは順列であるからで、組合せのみにしたいのならルールが必要であり、それはテーブルのリレーションではどうしようもありません。

組合せのみの登録にするには、(Alice,Bob)や(Bob, Alice)の登録の際、その組み合わせを昇順で並べ替えた上で登録済みのデータとチェックするなどの仕組みが必要になります。

投稿2020/02/20 04:40

編集2020/02/20 09:37
sazi

総合スコア25173

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

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

xebme

2020/02/20 09:20

組み合わせを作るとき、Θ結合で < 条件を指定することがあります。同様に、このテーブルにチェック制約(people_id_a < people_id_b)を付けることができますか。(people_id_a, people_id_b)はpkでかつそれぞれfkでもあるという条件のもとで、長短はなんでしょうか。
sazi

2020/02/20 09:39

チェック制約は可能だと思います。 何に対する比較で、長短を聞かれているのか分からないのですけど。
xebme

2020/02/20 10:26

つけるつけないで長短があるのかどうか知りたいと思ったのですが。
sazi

2020/02/20 11:58

チェック制約を付けた場合は、データを登録後の後処理を考えないと駄目なので、チェック制約を付けるぐらいなら、プログラム側で並べ替えをする方が効率的だと思います。
xebme

2020/02/20 15:34

チェック制約があれば、people_id_a と people_id_b を入れ替えた「重複」と、people_id_a と people_id_b が「等しい」場合が排除できるので、プログラムに頼らなくても良いと思ったのですが。ありがとうございました。
guest

0

relationテーブルでは、

  • 複合主キー、かつpeopleテーブルのidを参照する外部キー制約を持つ people_id_apeople_id_b を定義し、

アプリケーション側では、

  • Peopleオブジェクトのidをソートした状態でinsertする

のはいかがでしょうか。

投稿2020/02/20 04:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問