5

Tôi bắt đầu tìm hiểu công cụ này từ Hướng dẫn Flask Mega. Khi anh nhận được vào Nhiều-to-Nhiều mối quan hệ, ông tạo ra một bảng hiệp hội như thế này:Flask/SQLAlchemy - Sự khác biệt giữa mô hình hiệp hội và bảng kết hợp cho mối quan hệ nhiều-nhiều?

followers = db.Table('followers', 
    db.Column('follower_id', db.Integer, db.ForeignKey('user.id')), 
    db.Column('followed_id', db.Integer, db.ForeignKey('user.id')) 
) 

Khi tôi đang tìm kiếm cách để thêm một số siêu dữ liệu liên quan đến một hiệp hội cụ thể giữa các mô hình, tôi thấy rằng bạn có thể lưu trữ này kinda điều trong bảng hiệp hội .. Tuy nhiên, ví dụ này tôi đã tìm thấy dường như làm cho bảng hiệp hội một mô hình thực tế.

class DepartmentEmployeeLink(Base): 
    __tablename__ = 'department_employee_link' 
    department_id = Column(Integer, ForeignKey('department.id'), primary_key=True) 
    employee_id = Column(Integer, ForeignKey('employee.id'), primary_key=True) 
    extra_data = Column(String(256)) 
    department = relationship(Department, backref=backref("employee_assoc")) 
    employee = relationship(Employee, backref=backref("department_assoc")) 

Sự khác biệt giữa hai phương pháp này là gì? Phương pháp mô hình có cần thiết để lưu trữ siêu dữ liệu trong bảng kết hợp hoặc điều tương tự có thể được thực hiện bằng phương pháp hàng đầu không?

Cảm ơn!

Trả lời

7

lời xin lỗi của tôi, cuối cùng tôi stumbled trên câu trả lời trong các tài liệu SQLAlchemy ...

http://docs.sqlalchemy.org/en/rel_1_0/orm/basic_relationships.html#many-to-many

... nơi họ xác định một cách rõ ràng sự khác biệt:

Nhiều người đến Nhiều thêm một bảng kết hợp giữa hai lớp.

association_table = Table('association', Base.metadata, 
    Column('left_id', Integer, ForeignKey('left.id')), 
    Column('right_id', Integer, ForeignKey('right.id')) 
) 

Đối tượng mô hình hiệp hội là một biến thể trên nhiều-nhiều: nó được sử dụng khi bảng hiệp hội của bạn có chứa các cột bổ sung ngoài những đó là chìa khóa nước ngoài bên trái và bảng đúng. Thay vì sử dụng đối số thứ cấp, bạn ánh xạ một lớp mới trực tiếp đến bảng liên kết .

class Association(Base): 
    __tablename__ = 'association' 
    left_id = Column(Integer, ForeignKey('left.id'), primary_key=True) 
    right_id = Column(Integer, ForeignKey('right.id'), primary_key=True) 
    extra_data = Column(String(50)) 
    child = relationship("Child") 

Vì vậy, nó về cơ bản tạo ra một đối tượng để tham khảo thông tin thêm này nếu bạn cần lưu trữ bất cứ điều gì trong bảng hiệp hội, nếu không nó không cần thiết phải sử dụng lớp ORM và bạn chỉ có thể tạo ra một bảng.

Các vấn đề liên quan