🧩 グループ企業で考えるSQLAlchemyのリレーション
ORMのリレーションは、グループ会社や親子会社の契約関係に例えると、とてもイメージしやすくなる。
🔗 ForeignKey:個別契約書(子会社が親会社と交わす一方的な契約)
company_id = Column(Integer, ForeignKey('companies.id'))
-
子会社が「うちは◯◯ホールディングスの傘下です」と明記している
-
親会社側は特に何も知らなくても成立する(片想いの契約)
-
あくまでDBレベルの関係
🔗 relationship():業務連携を示す社内の通達
company = relationship("Company")
-
Pythonアプリ内で「この子会社の親会社にアクセスできるようにしておこう」というアクセスパスの設置
-
DBには影響を与えない
-
あくまで「参照しやすくするための内部リンク」
🔁 back_populates:お互いに交わす正式な双方向契約書
# 親会社側
subsidiaries = relationship("Subsidiary", back_populates="parent")
# 子会社側
parent = relationship("Company", back_populates="subsidiaries")
-
子会社と親会社がお互いの関係性を明示し合っている
-
双方が「うちはこの会社と関係があります」と相互認識している状態
-
Pythonアプリでも両方向のアクセスが可能
📝 backref:覚書のような一方的メモ書き
parent = relationship("Company", backref="subsidiaries")
-
子会社が「うちは◯◯の傘下」と定義しただけで、親会社にも自動で
subsidiaries
が生える -
手軽だが、細かい制御がしづらいこともある
-
自動的な覚書:便利だけど複雑な関係性には不向き
📌 まとめ表
ORM構文 | ビジネス比喩 | 特徴 |
---|---|---|
ForeignKey |
子会社が提示する親会社との契約書 | DBに明示する関係。片方向。 |
relationship() |
社内通達(アクセスリンク) | アプリ内の便利機能。 |
back_populates |
相互に押印された正式な契約書 | 双方向に明示された関係。 |
backref |
自動生成された覚書 | 片方の定義からもう片方に自動生成。 |