【问题标题】:Is ForeignKey concept a violation of SRP?ForeignKey 概念是否违反 SRP?
【发布时间】:2017-06-03 06:34:39
【问题描述】:

我想用一个 Django 示例来说明我的问题的一般性质:

class Person(models.Model):
    team = models.ForeignKey(Team, related_name='member', on_delete=models.CASCADE)

class Team(models.Model):
    pass

这里的目标是创建一种关系,表示一个人可以与一个且只有一个团队相关联

但是,Person 实体知道 Team 实体是否违反了 SRP,反之亦然?

我宁愿写类似

的东西
class Person(models.Model):
    pass

class Team(models.Model):
    members = models.OneToMany(Person, related_name='team', on_delete=models.CASCADE)

因此,每当引入新的 Entity-to-Person 关系(或现有的关系消失)时,都无需更新 Person 模型。

【问题讨论】:

  • 首先,这听起来像是语义;一个人是一个团队的成员。但更重要的是,您仍然需要某种方式将 team_id 存储在 Person 底层的数据库表中;如果不更改 Person 模型,您将如何做到这一点。
  • @DanielRoseman,我需要 Person 表中的 team_id 做什么,因为我可以在 Team 表中存储 member_id(唯一受限)?
  • 但是每个团队都有很多个成员。如何存储许多 member_id?
  • @DanielRoseman,你是对的,我不能 :) 不过,由于问题本质上是关于 Django 语义的,所以如果按如下方式实现该功能会很棒:每当我想表达它以“SPR”方式创建第三个表——类似于TeamToMembers——与 Person 的 OneToOne 关系和与 Team 的 ForeignKey,以及模拟标准 CRUD 操作的额外便利方法,但关于那个表。
  • 我想,这个问题现在应该结束了。谢谢@DanielRoseman 的澄清。

标签: django design-patterns database-design foreign-keys foreign-key-relationship


【解决方案1】:

对象之间的关联不定义职责。显然,您不希望将不相关的对象与给定的实体相关联,但这更多的是关于一个好的设计,而不是关于责任的事情。

责任更多地与行为联系在一起。也就是说,您不希望使用表来管理团队,但分配有团队领导角色的团队成员应该能够管理团队。因此,团队负责人管理团队成员及其需求,而团队负责人也无法定义如何支付团队成员的薪水。

顺便说一句,这可能取决于您真正用于实现解决方案的范例和模式。如果您将实体实现为active records,我会担心行为。否则,大多数功能将进入service layer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2013-04-28
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多