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

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

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

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

データベース設計

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

Q&A

1回答

1636閲覧

DBのテーブル設計で悩んでいます。外部キーを張ると複数のテーブルを指してしまう。よい解法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

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

データベース設計

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

0グッド

0クリップ

投稿2021/03/19 10:29

編集2021/03/19 11:34

前提・実現したいこと

下図の「タブレットテーブル」の構成は一切変えず、
「支払いテーブル」と「タブレットテーブル」と「スマホテーブル」をうまくリレーションが持てる状態にしたい。

発生している問題・エラーメッセージ

とあるカラムが、外部キーを張ると、複数の参照先を指してしまう。
イメージ説明

補足情報(FW/ツールのバージョンなど)

図でいう「タブレットテーブル」「スマホテーブル」の構成はほぼ同じです。
タブレットテーブルのデータは読み込みのみ、スマホテーブルのデータは編集可能です。
ですので、タブレットテーブルとスマホテーブルを1つにまとめるという案は無しで、
それ以外のよい方法ご存知でしたらご教示ください。

DBMSはPostgresの最新バージョンを使う予定です。

詳細な背景

マスタデータ「タブレットテーブル」「スマホテーブル」
トランザクションデータ「支払い精算テーブル」

タブレットテーブルは毎日利用者が変わり、バッチ処理でデータが変わっています。

一方、スマホテーブルはほぼ利用者が変わることがありません。
なので、同一構成の別テーブルとなっています。

また、タブレットテーブルとスマホテーブルの端末シリアル番号は2つ併せて一意な値として保持しています。
なのでこの一意な値で、いわゆる支払い精算テーブルに、端末シリアル番号を持たせることで、
どのデータか特定できる状態になります。

タブレットテーブルに区分値を追加したいのですが、
そもそもの要件が固まっていないため、不要になる可能性も孕んでいます

ただ、1つのカラムに2つ以上の外部リレーションを持つ構成はどうなんだ、と思い、
本質問に至ります。

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

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

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

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

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

hentaiman

2021/03/19 10:40

ググるよりオラクルブロンズのSQLの方でも学習した方が基礎が身に付いて良いかもしれない
退会済みユーザー

退会済みユーザー

2021/03/19 10:46

オラクルブロンズのSQLを見れば分かるのでしょうか? 業務上の制約で上のような構成になります。単純にスマホ、タブレットをひとくくりにする端末テーブルに区分値を持たせるようなやり方ではだめです。 そのような制限の元、よいリレーションの持たせ方ご存知でしょうか?
hentaiman

2021/03/19 10:48

じゃあそれを質問に書いてください そしてその場合は他にも条件があるんじゃないですか? 少なくとも質問者は今のテーブル設計がクソ設計だと分かった上で変えられないから質問している訳ですが、質問文を読んだだけではその背景などは分かりません
退会済みユーザー

退会済みユーザー

2021/03/19 11:06

大変失礼しました。 補足情報に追加したので、お分かりいただける状態になったかと思います。
hentaiman

2021/03/19 11:16

他に条件無いんですか?親が二つのリレーションが無理な事はご存知だと思うので、設計ベースで考えるのではなく何をしたいかの目的ベースで考えてそれを実現する方法なりテーブル設計なりを考えるんです 目的を達する方法はSQLでもプログラムでもまた別のテーブル設計でも良いという訳です もちろんDB的にリレーションを張らないテーブルを作ったっていいわけですが、その辺は見えない条件に合わせて適当に考えましょうってところです
退会済みユーザー

退会済みユーザー

2021/03/19 11:30

すみません、業務の兼ね合いもあるので詳しくは書けませんが、 精一杯背景を書かせて頂きました。 おっしゃる内容はよくわかります。 できればテーブル定義で実現したいことを実現し、 アプリケーション側に負担をかけたくないのです。(コーディングレベルの問題があるので
hentaiman

2021/03/19 11:49

アプリケーション側の負担がどんなものを指しているのか分かりません。 INSERT時の不整合を気にしているのならfunctionを作るとかになると思うんですがそこは問題無くて既にユニークな値を保存出来てるわけですよね? リレーションを貼る目的は何でしすか?ON ~~~の制約をつけたいんでしょうか? 達成したい目的はなんですか?
hoshi-takanori

2021/03/19 13:51

支払い精算テーブルから端末 (タブレットまたはスマホ) に紐づけたい理由って何でしょうか? その支払いが行われた端末を特定するため? 支払いを処理した担当者 (端末利用者) を特定するためではなく?
guest

回答1

0

この一意な値で、いわゆる支払い精算テーブルに、端末シリアル番号を持たせることで、どのデータか特定できる状態になります。

どのようなSQLで問合せされようと考えていますか?
一筆書きするなら、正規化されていないので**union **するしかないですよね。

「タブレットテーブル」の構成は一切変えず、「支払いテーブル」と「タブレットテーブル」と「スマホテーブル」をうまくリレーションが持てる状態にしたい。

リレーションとは何のことを言われているのでしょう?
ER図的な関係を言うだけの話なら、unionしたものをviewとして定義して、それとリレーションしているようにすれば良いと思いますけど。

制約の話なら、独自に定義するしかありませんね。

投稿2021/03/19 14:23

編集2021/03/19 14:27
sazi

総合スコア25195

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問