Я ищу чистый способ моделирования данных, который не является обязательным, но если он будет включен, будет содержать ссылку на другие данные.
В приведенном ниже примере самое чистое реляционное моделирование состоит в том, чтобы отделить человека, план страхования и страховую компанию.
class InsurancePlan(models.Model):
name = models.CharField(max_length=100, default="Not Indicated")
insurancecompany = models.ForeignKey(InsuranceCompany, on_delete=models.CASCADE, null=True, blank=True)
claims_address = models.OneToOneField(UsLocation, on_delete=models.CASCADE, blank=True, null=True)
class InsuranceCompany(models.Model):
name = models.CharField(max_length=50)
some_important_id = models.CharField(max_length=50)
class Insured(models.Model):
name = models.CharField(max_length=50)
plan = models.ForeignKey(InsurancePlan, on_delete=models.CASCADE)
, а затем либо добавить поле member_id
в застрахованную модель, либо создатьInsured_Plan
таблица, которая связывает их.
Однако что, если бизнес-требования говорят, что наличие информации InsurancePlan
является необязательным, потому что мы можем получить, просто зная ID участника и InsuranceCompany
?
нормально ли иметь:
class Insured(models.Model):
name=...
plan = models.ForeignKey(InsurancePlan, on_delete=models.CASCADE, null=True, blank=True)
insurance_summary = models.ForeignKey(InsuranceCompany, on_delete=models.CASCADE)
member_id = models.CharField()
Я немного заржавел в реляционном моделировании, но я думаю, что у меня есть fk от A до B, а у другого от A до C, где у C естьfk to B также не является хорошей практикой.
Обновление : Я думаю, что лучший подход - это
class Insured(models.Model):
name=models.CharField(max_length=20)
class InsurancePlan(models.Model):
name=models.CharField(max_length=20, defualt="unknown/not_applicable")
members=ManyToManyField(Insured, through='Membership')
claims_address=models.OneToOneField(UsLocation, blank=True, null=True)
insurance_company=models.ForeignKey(InsuranceCompany, on_delete=models.CASCADE)
class Membership(models.Model):
insured=ForeignKey(Insured, on_delete=models.CASCADE)
plan=ForeignKey(InsurancePlan, on_delete=models.CASCADE)
member_id=models.CharField(max_length=30)
, а затем просто сделать InsurancePlan
обязательным, поскольку мы можемиспользовать общий пустой план по умолчанию.