【问题标题】:Modeling a database many to many relationship between three tables using sqlalchemy in python在 python 中使用 sqlalchemy 对三个表之间的数据库多对多关系建模
【发布时间】:2011-09-28 08:35:27
【问题描述】:

让我们考虑以下用于 python 中的 sqlalchemy 的表模型。

class Worker(Base):
    id Column(Integer, primary = True)
    name Column(String, nullable = False)

class Project(Base):
    id Column(Integer, primary = True)
    name Column(String, nullable = False)

class Rating(Base):
    id Column(Integer, primary = True)
    description Column(String, nullable = False)

让我们考虑一下对这些表的一些限制。 (请不要质疑这个例子的意义,这是我想出的最好的描述我想学习的东西。:-))

  1. 一个worker 可能有多个projects 可以处理。
  2. project 可能分配有多个 workers 来处理它。
  3. 对于每个元组(worker, project),你有一个不同的rating

我明白,我有三个多对多的关系。它们是:

  1. 工人和项目
  2. 工人和评级
  3. 评级和项目

定义两个表之间的多对多关系没有问题。我只需要将以下关联表和关系添加到我的模型中。

worker_project = Table('worker_project', METADATA,
                       Column('worker_id', Integer, ForeignKey('workers.id')),
                       Column('project_id', Integer, ForeignKey('projects.id')),

class Worker(Base):
    # [...]
    papers = relationship('Project',
                          secondary=worker_project,
                          backref='workers')

我做不到的是像上面描述的那样链接表格“评级”。感谢任何帮助。

【问题讨论】:

    标签: python database-design model sqlalchemy relationship


    【解决方案1】:

    将评分表制作成这样。

      Rating
    ---------------------
      rating_id (primary key) 
      worker_id (foreign key - worker(worker_id)) 
      project_id (foreign key - project(project_id)) 
      description
    

    如果我理解正确的话。

    【讨论】:

    • 假设数据库中有一些数据,这意味着:worker.rating_id 会给我一组工人的所有评级。 project.rating_id 会给我一组从事特定项目的所有工人的所有评级。正确的?给定一个工人和一个项目,我总是需要计算 worker.rating_id 和 project.rating_id 的交集来获得给定作者在某个项目中的评分,对吧?
    • 如果你有一个 workerid 和一个 projectid,你只需 "SELECT * FROM Rating WHERE workerid = ? AND projectid = ?;"并会给你那个“项目+工人”组合的评级行(不知道如何将它翻译成sqlalchemy语法)。我认为您不需要工人和评级之间的多对多关系。
    • 我假设您只想为每个(项目+工人)提供一个评分。
    • 这正是我想知道的,非常感谢!我会试试这个,看看结果如何。
    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2012-04-17
    • 2020-03-27
    • 2015-01-03
    • 2019-08-24
    • 2017-10-23
    相关资源
    最近更新 更多