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

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

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

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

データベース

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

データベース設計

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1110閲覧

複数のテーブルに対してリレーションを張ることはできるか

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

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

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

データベース

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

データベース設計

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/05/30 06:15

実現したいこと

  • SQLAlchemyを使って、仕入先、販売先等の情報をまとめるデータベースを作成したいです。
  • 仕入先も販売先も、個人の場合もあるし、法人の場合もあります。
  • 仕入先であり、かつ、販売先である場合もあります。
  • テーブルの構成をどのようにすべきか悩んでおります。

私が考えたテーブルの構成

①Person(個人毎のテーブル)

id氏名住所
1山田太郎東京都〇〇
2田中次郎神奈川県〇〇
3鈴木三郎千葉県〇〇

②Organization(法人等組織のテーブル)

id名称住所
1株式会社A東京都〇〇
2株式会社B神奈川県〇〇

③Position(役職のテーブル)

②Organization①Person役職名
株式会社A山田太郎部長
株式会社A田中次郎課長

④Item(販売製品のテーブル)
|id|製品名|仕入先|販売先|
|:--|:--|:--|
|1|機械1|株式会社A|鈴木三郎|
|2|機械2|鈴木三郎|株式会社A|

上記の④Itemを見て頂ければ分かるように、
機械1のように法人から仕入れて個人に販売したり、機械2のように個人から仕入れて法人に販売したり、パターンは色々あります。

④Itemにおいて、どのようにリレーションを設定すべきかと悩んでおります。
①Personと②Organizationの両方を参照できるようなリレーションは、設定できるのでしょうか。
上記のような場合、一般的にどのように処理されているのかと思い、お分かりの方、ご教示頂ければ幸いです。
よろしくお願い致しますm(__)m

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

  • データベースは、PostgreSQLを利用しています。

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

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

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

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

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

guest

回答2

0

ベストアンサー

個人と法人のさらに上位概念の customer テーブルをつくるようにします。

idtype_nameetype_id
1Person1
2Person2
3Person3
4Organization1
5Organization2

item テーブルは customer の id を保持するようにします。

id製品名仕入先販売先
1機械143
2機械234

cutomer テーブルをもつのが嫌なら 購入先、ハイバイ先は item に type と id

id製品名仕入先_type仕入先_id販売先_type販売先_id
1機械1Organization1Person3
2機械2Person3Organization1

こういったケース対処法はいろいろあり、それぞれメリット・デメリットがあります。

  • 複数のテーブルに対して多対一で紐づくテーブルの設計アプローチ

https://spice-factory.co.jp/development/has-and-belongs-to-many-table/

  • SQLアンチパターン勉強会 第6回:ポリモーフィック関連

https://qiita.com/dai329/items/1db8fbe37f43a465d801

投稿2020/05/30 21:11

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2020/05/31 13:20

ありがとうございます。 そんな言葉があるとは知りませんでしたが、ご指摘のポリモーフィック関連の問題だと思います。5パターンも解決策があり、それぞれメリット・デメリットがあるということですね。 よく学んでから選びたいと思います。
guest

0

※個人の感想です。

PersonとOrganizationの上位テーブルとして「取引先(Client)」テーブルを設定し、個人と法人の共通するデータだけ管理する。Client.idはPerson,Organization共通のidとして設定する。
そうすると、Itemにおいて仕入先、販売先を共通のidで管理できる。

Client

id名称区分
1山田太郎個人
2田中個人
3鈴木個人
4(株)A法人
5(株)B法人

Person

id名称住所...
1山田太郎東京都......
2田中神奈川県......
3鈴木千葉県......

Organization

id名称住所...
4(株)A埼玉県......
5(株)B茨城県......

投稿2020/05/30 07:08

hope_mucci

総合スコア4447

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

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

退会済みユーザー

退会済みユーザー

2020/05/30 20:55

ありがとうございます。 ご回答を読んで思ったのですが、PersonとOrganizationで共通のidを付けるのであれば、いっそのこと、一つのテーブルにして、法人の場合はチェックを付けるカラムを設ければ良いかもしれないですね。 ただ、ある法人に所属している個人がいるので、一つのテーブルの中に複数のリレーションを張るということをしなければなりませんが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問