关联表和常规表有啥区别?

Posted

技术标签:

【中文标题】关联表和常规表有啥区别?【英文标题】:What's the difference between an association table and a regular table?关联表和常规表有什么区别? 【发布时间】:2020-12-31 03:37:04 【问题描述】:

我不认为我完全理解关联表。我知道如何使用普通表,即添加行等等,但我不明白如何使用关联表。

我为什么要使用下面的

    student_identifier = db.Table('student_identifier',
    db.Column('class_id', db.Integer, db.ForeignKey('classes.class_id')),
    db.Column('user_id', db.Integer, db.ForeignKey('students.user_id'))
)

对比

class studentIdent(db.model):
  db.Column(db.Integer, db.ForeignKey('classes.class_id')),
  db.Column(db.Integer, db.ForeignKey('students.user_id'))

【问题讨论】:

一般情况下,您从不直接在代码中使用关联表,因此创建模型类没有任何价值。 @snakecharmerb - 请参阅相关问题的 cmets here 【参考方案1】:

正如对该问题的评论中所述,如果关联表仅包含链接多对多关系中两个表的外键,则您不会费心为关联表创建 class。在这种情况下,您的第一个示例 - association table - 就足够了。

但是,如果您想存储有关两个表之间链接性质的其他信息,那么您将需要创建一个association object,以便您可以操作这些附加属性:

class StudentIdent(db.Model):
    __tablename__ = "student_identifier"
    course_id = db.Column(
        db.Integer, 
        primary_key=True, 
        autoincrement=False,
        db.ForeignKey('courses.course_id')
    )
    user_id = db.Column(
        db.Integer, 
        primary_key=True, 
        autoincrement=False,
        db.ForeignKey('students.user_id')
    )
    enrolment_type = db.Column(db.String(20))
    # reason for student taking this course
    #   e.g., "core course", "elective", "audit"

然后您可以通过创建关联对象的新实例来创建给定学生和特定课程之间的链接:

thing = StudentIdent(course_id=3, user_id=6, enrolment_type="elective")

注意:这只是一个基本的链接。您可以通过在 ORM 对象之间显式声明 relationship 来变得更复杂。

【讨论】:

谢谢,但我想我的问题是为什么不总是创建一个类?它似乎更通用,有什么好处吗? 在(目前)不是绝对必要的情况下创建一个类的一个好处是面向未来。您可能有一个多对多关系,当前不需要与之关联的额外属性,但您的经验和专业判断告诉您它可能需要稍后会添加此类附加属性。在这种情况下,您可以使用类来构建模型,因为它不会真正造成任何伤害,并且可以让以后更容易扩展模型。

以上是关于关联表和常规表有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中left join和union有啥区别?

嵌套数组和关联数组有啥区别?

where 子句和使用关联对象来提高性能之间有啥区别吗

如何看待因果关系与关联规则有啥区别?

trait 的泛型类型和泛型关联类型之间有啥区别?

DOM 级别有啥区别,它们是如何相互关联的?