sql - 不同列中的一对多关系
问题描述
这是我很难找到明确答案的新蜜蜂 SQL 问题。所以请帮忙。我在数据库中有两个表,其字段如下所示:
建设项目
- id(唯一,非空)
- 开发者(一,非空)
- main_contractor(一,非空)
- 建筑师(一,非空)
- (其他领域)
公司
- id(唯一,非空)
- 项目_开发(很多或没有)
- 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'))
解决方案
推荐阅读
- c# - Hololens 2 & Unity - 如何使用 CameraToWorldMatrix 来校正全息图的位置?
- php - 如何在 PhpStorm 中强制使用单引号或双引号?
- typo3 - 如何从呈现给我的自定义布局的 TYPO3 内容元素中获取标题?
- python - 使用子进程从 cmd 执行 python shell
- amazon-web-services - 另一个账户中来自 Lambda 的 AWS CrossAccount S3 PutObject
- regex - 正则表达式比较一行中的两个子字符串
- python - Pandas 数据框 - 根据多个条件计算创建多个列
- python - exec() 调用中非常大的 python 函数定义会导致 Django 崩溃,但不会导致直接执行的 Python 代码崩溃
- php - php中json格式数据的日期时间验证
- python - Python shutil 复制到网络文件夹 OSError:[Errno 22] 无效参数: