昨天看過了一對多的資料庫關聯,今天我們會來看看多對多的資料庫關聯,多對多關聯是一種資料庫中常見的關聯型態,它描述了兩個實體之間的關係,其中一個實體可以與多個另一實體相關聯,反之亦然。這種關聯型態通常用於模擬現實世界中的多對多關係,其中一個實體可以關聯到多個不同的實體,同時這些不同的實體也可以關聯到多個相同的實體。像是音樂家和音樂樂器:一位音樂家可以演奏多種樂器,同時一種樂器可以被多位音樂家演奏。這種關聯型態用於描述音樂家和他們演奏的樂器之間的關係。
除了一對多關聯,還有另一個常見的情況為多對多的關聯,例如標籤(Tag)
和文章(Post)
之間的關聯。一篇文章可以有多個標籤,一個標籤也可以關聯到多篇文章。
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
# 中間表用於處理多對多關聯
musician_instruments = db.Table('musician_instruments',
db.Column('musician_id', db.Integer, db.ForeignKey('musician.id'), primary_key=True),
db.Column('instrument_id', db.Integer, db.ForeignKey('instrument.id'), primary_key=True)
)
class Musician(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100))
instruments = db.relationship('Instrument', secondary=musician_instruments, backref='musicians', lazy='dynamic')
class Instrument(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
Musician
和 Instrument
,並使用 musician_instruments
作為中間表,以建立它們之間的多對多關聯。每個模型都有一個主鍵 id
和一個名稱屬性,用於描述音樂家的名稱和樂器的名稱。# 創建音樂家
musician1 = Musician(name='John')
musician2 = Musician(name='Alice')
# 創建樂器
instrument1 = Instrument(name='Guitar')
instrument2 = Instrument(name='Piano')
# 建立音樂家和樂器之間的關聯
musician1.instruments.append(instrument1)
musician2.instruments.append(instrument1)
musician2.instruments.append(instrument2)
# 提交到資料庫
db.session.add_all([musician1, musician2, instrument1, instrument2])
db.session.commit()
# 查詢 John 彈奏的樂器
john = Musician.query.filter_by(name='John').first()
john_instruments = john.instruments.all()
print([instrument.name for instrument in john_instruments])
# 輸出:['Guitar']
多對多關聯模型允許我們在模型之間建立複雜的關聯,例如上面,可以讓一位音樂家可以演奏多種樂器,同時一種樂器也可以被多位音樂家演奏。通過使用中間表來處理這種關聯,我們可以輕鬆地創建、查詢和操作這些關聯數據,使我們的應用程式更具靈活性和功能性。