Schema

同一張表中的兩條記錄必須以某種方式相關

  • September 18, 2020

我繼承了一個有點奇怪的表,它的記錄必須以某種方式相互連結。在現實世界中,這兩個“結構”被組合成一個更大的“結構”,所以應該有一種連接它們的方法。

我應該使用“關聯表”來連結兩個 ID,**還是有更好的方法來處理這種事情?**也許我已經回答了我自己的問題,但我想我會問是否還有其他方法……

另一種選擇是刪除第二條記錄,同時在第一條記錄中添加對第二條記錄的引用作為新列。

也許這對於這個網站來說是一個荒謬的開放式問題,但我肯定不是第一個遇到這個問題的人……

謝謝,肖恩

我最終使用了一個自引用的多對多關聯表,其中一個結構可以與同一張表中的許多其他結構相關聯。

在 Python 的 Flask-SQLAlchemy 庫中,關聯表是這樣表示的:

structure_structure_rel = db.Table(

   'structure_structure_rel',

   db.Column(
       'primary_structure_id', 
       INTEGER, 
       db.ForeignKey('public.structures.id', ondelete="CASCADE"), 
       primary_key=True
   ),

   db.Column(
       'secondary_structure_id', 
       INTEGER, 
       db.ForeignKey('public.structures.id', ondelete="CASCADE"), 
       primary_key=True
   ), 

   schema='public'
)

這是實際的“結構”表,在 SQLAlchemy 對象關係模型 (ORM) 中表示為一個類:

class Structure(db.Model):
   """Create a public.structures PostgreSQL table representation 
   for use in Python Flask-SQLAlchemy
   """

   __tablename__ = 'structures'
   __table_args__ = {"schema": "public"}

   id = db.Column(INTEGER, primary_key=True)

   ...

   # Super-cool self-referential many-to-many relationship
   secondary_structure_id = db.relationship(
       'Structure', 
       secondary=structure_structure_rel,
       primaryjoin=(structure_structure_rel.c.primary_structure_id == id),
       secondaryjoin=(structure_structure_rel.c.secondary_structure_id == id),
       backref=db.backref('primary_structure_id', lazy='select'), 
       lazy='select'
   )

然後我可以在 Flask-Admin 中使用這兩個關係“列”(即 primary_structure_id 和 secondary_structure_id),這非常好。

-肖恩

我相信記錄“這 2 個以上的項目用於製作這 1 個更大的項目”的要求稱為 BOM。(材料清單)。

我在實際中看到的唯一一組 BOM 表對每個深度使用了 1 個表。您的 BOM 只需要這兩個表。

TL;DR - 使用“關聯表”。

引用自:https://dba.stackexchange.com/questions/275686