Это вопрос 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'))