отношения один ко многим в разных столбцах - PullRequest
0 голосов
/ 06 января 2019

Это вопрос SQL для новичка, на который я пытался найти четкий ответ. Поэтому, пожалуйста, помогите. У меня есть две таблицы в базе данных с полями, перечисленными ниже:

ConstructionProjects

  • id (уникальный, непустой)
  • разработчик (один, непустой)
  • main_contractor (один, непустой)
  • архитектор (один, непустой)
  • (другие поля)

Компания

  • id (уникальный, непустой)
  • projects_developed (много или нет)
  • projects_as_main_contractor (много или нет)
  • projects_as_architect (много или ни одного)
  • (другие поля)

Таким образом, у каждого проекта есть только один разработчик, один архитектор и один подрядчик, однако это может быть одна и та же компания. Любая компания может участвовать в любом количестве проектов в любых ролях.

Есть ли способ избежать создания 3 дополнительных таблиц ассоциаций, чтобы установить отношения многие ко многим? и сделать 3 отношения один ко многим вместо этого? Если да, то какая практика лучше?

* Другими словами, я не понимаю отношения (один ко многим и много ко многим), связывающие (1) строку с строкой или (2) строку с «конкретной ячейкой»?

  • (1) если строка за строкой, то у меня много-много отношений
  • (2) если строка в определенной ячейке, то она кратна отношениям один ко многим ... *

Я изучаю Flask_alchemy и PostgreSQL. Я столкнулся с проблемой, написав такой код (нет ссылки на конкретные столбцы между таблицами). Так это не нормально?

class Company(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    constr_projects_developed = db.relationship('ConstrProject', backref='developer') 
    constr_projects_main_contracts = db.relationship('ConstrProject', backref='main_contractor')
    constr_projects_architect = db.relationship('ConstrProject', backref='architect')

class ConstrProject(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    developer_id = db.Column(db.Integer, db.ForeignKey('company.id'))    
    main_contractor_id = db.Column(db.Integer, db.ForeignKey('company.id'))
    architect_id = db.Column(db.Integer, db.ForeignKey('company.id'))

Тогда мой вопрос: правильный способ сделать это так (1):

class Company(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    constr_projects_developed = db.relationship('ConstrProject', back_populates='developer') 
    constr_projects_main_contracts = db.relationship('ConstrProject', back_populates='main_contractor')
    constr_projects_architect = db.relationship('ConstrProject', back_populates='architect')

class ConstrProject(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    developer_id = db.Column(db.Integer, db.ForeignKey('company.id'))    
    developer = db.relationship('Company', back_populates='constr_projects_developed')
    main_contractor_id = db.Column(db.Integer, db.ForeignKey('company.id'))
    main contractor = db.relationship('Company', back_populates='constr_projects_main_contracts')
    architect_id = db.Column(db.Integer, db.ForeignKey('company.id'))
    architect = db.relationship('Company', back_populates='constr_projects_architect')

Или вот так (2)?:

class Company(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    cp_developed = db.relationship('Company', secondary=cp_developer_company, back_populates='developer')
    cp_main_contracts = db.relationship('Company', secondary=cp_main_contractor_company, back_populates='main_contractor')
    cp_architects = db.relationship('Company', secondary=cp_architect_company, back_populates='architect')

class ConstrProject(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    developer = db.relationship('Company', secondary=cp_developer_company, back_populates='cp_developed')
    main_contractor = db.relationship('Company', secondary=cp_main_contractor_company, back_populates='cp_main_contracts')
    architect = db.relationship('Company', secondary=cp_architect_company, back_populates='cp_architects')

cp_developer_company = db.Table('cp_developer_company'
    db.Column('company_id', db.Integer, db.ForeignKey('company.id'))
    db.Column('constr_project_id', db.Integer, db.ForeignKey('constrproject.id'))
    )

cp_main_contractor_company = db.Table('cp_main_contractor_company'
    db.Column('company_id', db.Integer, db.ForeignKey('company.id'))
    db.Column('constr_project_id', db.Integer, db.ForeignKey('constrproject.id'))
    )

cp_architect_company = db.Table('cp_architect_company'
    db.Column('company_id', db.Integer, db.ForeignKey('company.id'))
    db.Column('constr_project_id', db.Integer, db.ForeignKey('constrproject.id'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...