是否需要定义所有数据库关系?是否应新增‘company-advertising’直接关系?
嘿,咱们一步步来拆解你的问题,结合你给出的表结构和场景来分析:
要不要定义数据库中的所有关系?
答案是不需要。数据库设计里,我们只需要定义业务上有直接意义、或者能保障数据核心一致性的关系,没必要把所有隐含的传递关系都显式定义出来。比如你现在的company 1-n person和person 1-n advertising已经能推导company 1-n advertising,这种隐含关系如果没有特殊业务或性能需求,完全不需要单独建字段或约束。
要不要添加
company-advertising直接关系? 这得看你的业务场景和核心诉求,咱们对比两种方案的优缺点:
方案1:保持现有关系(通过person关联)
优势:
- 数据无冗余:不需要在
advertising表加额外的company_id字段,避免数据重复存储 - 天然一致性:只要
person的company_id是正确的,广告的所属公司就自动正确,不会出现“广告的company_id和所属员工的company_id不一致”的脏数据 - 逻辑简洁:业务逻辑只需要维护员工和公司的关系,广告跟着员工走就行
劣势:
- 多表关联查询:每次从广告查公司都要连3张表,数据量大的时候可能会有轻微的性能损耗(不过大部分场景下,合理加索引就能解决)
方案2:新增advertising.company_id,显式关联company
优势:
- 查询更高效:直接通过广告表的
company_id关联公司,少一次表连接,查询语句更简洁(比如SELECT * FROM advertising JOIN company ON advertising.company_id = company.id) - 业务语义更清晰:如果广告本质上是公司直接发起的,只是由某个员工负责,那显式关联公司更符合业务逻辑
劣势:
- 数据冗余&一致性风险:额外存储的
company_id需要和所属员工的company_id保持一致,一旦员工换公司,你得同步更新广告的company_id——要么在数据库层面加触发器/事务,要么在应用层写额外的更新逻辑,不然很容易出现数据矛盾 - 维护成本增加:多了一个字段需要维护,后续的CRUD操作都要考虑这个字段的正确性
哪种方案更合理?
没有绝对的标准答案,核心看你的业务逻辑:
- 如果广告的所属公司完全依赖于负责它的员工(员工换公司,广告就归新公司),那保持现有关系更稳妥,避免一致性问题
- 如果广告是公司直接创建的,员工只是对接人(即使员工换公司,广告还是属于原公司),那显式添加
company-advertising关系更合理,既符合业务语义,又能提升查询效率 - 如果只是为了减少一次表连接,但数据量不大、现有查询性能没问题,那没必要折腾——毕竟一致性维护的成本往往比那点性能损耗更高
举个实际例子:如果是员工个人接的私单广告,那跟着员工走;如果是公司统一投放的广告,只是指定某个员工跟进,那直接关联公司更合适。
内容的提问来源于stack exchange,提问作者Thomas Müller
相关产品推荐
相关产品推荐

