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

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

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

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

SQL

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

Q&A

解決済

3回答

903閲覧

多対多のデータベースの実現

Kokusho

総合スコア6

PostgreSQL

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

SQL

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

0グッド

0クリップ

投稿2020/02/27 20:07

前提・実現したいこと

今現在PostgreSQLを学習しています。そこで多対多リレーションを実現するには2対の一対多リレーションを作ればよい→余分にテーブル(テーブルC)を作成する
ということが分かったのですが、
その教科書ではそのテーブルC内に元となる2テーブルのプライマリキーが入っています。しかし、プライマリキーはテーブル内でユニークで繰り返し現れてはいけないkeyと認識しており、テーブルC内のその二つのキーはフォーレインキーとして定義されるべきだと思いました。
ですがその教科書ではテーブルC内でもPK2つとして定義されています。
この表現は正しいのでしょうか?

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

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

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

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

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

m.ts10806

2020/02/27 22:21

テーブル定義もご提示ください。 教科書云々言われても書名も出てませんし全ての人が書籍を使うわけではありません。
guest

回答3

0

テーブル C はこんな感じですよね。

SQL

1CREATE TABLE TABLE_C ( 2 TABLE_A_ID INT REFERENCES TABLE_A (ID), 3 TABLE_B_ID INT REFERENCES TABLE_B (ID), 4 PRIMARY KEY (TABLE_A_ID, TABLE_B_ID) 5);

このとき、TABLE_A_ID と TABLE_B_ID はそれぞれフォーリンキーであり、TABLE_A_ID と TABLE_B_ID の組み合わせが TABLE_C のプライマリーキーになります。

例えば TABLE_A に ID が 1, 2, 3 のデータがあり、TABLE_B に ID が 100, 200, 300 のデータがあるとすると、TABLE_C には (1, 100), (1, 200), (2, 300), (3, 100) のようなデータを INSERT できます。
TABLE_C のプライマリーキーは TABLE_A_ID と TABLE_B_ID の組み合わせなので、(1, 100) と (1, 200) や (2, 300) と (3, 300) のように TABLE_A_ID と TABLE_B_ID のどちらがか同じでも構わない(でも両方同じのはダメ)です。

投稿2020/02/27 21:27

hoshi-takanori

総合スコア7893

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

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

0

教科書が見えませんので、テーブルCから想像してテーブルAとテーブルBが存在するしています。想像ミスはご了承ください。
テーブルA(生徒)にはpkeyA、テーブルB(科目)にはpkeyBと言うプライマリーキーがあります。
テーブルC(履修)は、pkeyA、pkeyBを持ち、2つはプライマリキーまたはユニークキーとします。
テーブルCの2項目をプライマリにするのはユニークのは重複作成を制御する為です、ユニーク指定が重要で必ずしもプライマリ(自動的ユニーク指定)にしなくても良いです。プライマリにするとER図作成の時は便利かも。

テーブルCのフォーリンキーはテーブルCの存在条件を満たすためのものです。
テーブルC存在している事は、テーブルA、テーブルBの存在が保証されます。

利用時のメリット
検索時にJOINすると思いますが、重複が発生しません。
テーブルC作成時に間違ったキーで作成できません。
テーブルA,テーブルBの削除時にテーブルCを一緒に削除する事ができます。

投稿2020/02/27 22:55

編集2020/02/27 23:03
amura

総合スコア333

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

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

0

ベストアンサー

ですがその教科書ではテーブルC内でもPK2つとして定義されています。

教科書の中身がわからないので確定はできないですが、それは複合プライマリーキーではないでしょうか。

複数の列をプライマリーキーとして指定すると、指定した列の組み合わせが一意であることを保証するようなプライマリーキーとなります。

投稿2020/02/27 21:22

maisumakun

総合スコア145121

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問