2011-07-04 76 views
3

讓我們考慮下python中sqlalchemy的表模型。在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. A 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') 

我做失敗中,像上述鏈接表「評分」。任何幫助表示讚賞。

回答

4

使收視率表如下所示。

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

如果我正確地理解這是。

+0

假設數據庫中有一些數據,這意味着:'worker.rating_id'會給我一組工人的所有評級。 'project.rating_id'會給我一組所有在特定項目上工作的工作人員的評分。對?給定一個工人和一個項目,我總是會計算'worker.rating_id'和'project.rating_id'的交集,以獲得給定作者在某個項目上的評分,對吧? – Aufwind

+1

如果你有一個workerid和一個projectid,你只需要「選擇*從評級where workerid =?和projectid =?;」並會爲您提供該'project + worker'組合的評級行(不知道如何將其轉換爲sqlalchemy語法)。我認爲你不需要工人和評級之間的多重關係。 –

+0

我假設你只想爲每個(項目+工作人員)順便一個評分。 –

相關問題