【发布时间】:2020-12-18 15:47:08
【问题描述】:
问题是概念性的(数据库关系),所以语言不是这里的重点,但我使用的是 Python 和 Django。
我有 3 个模型/表格:
- 公司
- 客户
- 地址
例如。
class Company(models.Model):
name = models.CharField(max_lenght=100) #example
class Customer(models.Model):
name = models.CharField(max_lenght=100) #example
class Adress(models.Model):
country = models.CharField(max_lenght=100) #example
state = models.CharField(max_lenght=100) #example
# here I want the address owner
# I could put something like this:
company = models.ForeignKey(Company, on_delete=models.PROTECT)
customer = models.ForeignKey(Customer, on_delete=models.PROTECT)
我希望地址属于客户或公司,但不能同时属于两者。
我知道我可以简单地创建 2 个地址类,例如 CustomerAddress、CompanyAddress,每个类都有其正确的外键:
class Company(models.Model):
name = models.CharField(max_lenght=100) #example
class Customer(models.Model):
name = models.CharField(max_lenght=100) #example
class CompanyAdress(models.Model):
country = models.CharField(max_lenght=100) #example
state = models.CharField(max_lenght=100) #example
company = models.ForeignKey(Company, on_delete=models.PROTECT)
class CustomerAdress(models.Model):
country = models.CharField(max_lenght=100) #example
state = models.CharField(max_lenght=100) #example
customer = models.ForeignKey(Company, on_delete=models.PROTECT)
但我不想这样做有两个原因:
- 重复的代码以及在 Django 管理面板中我将有两个单独的地址列表这一事实,这没有多大意义,因为所有地址在结构上都是相同的。我可以修复创建基类、继承基类等的重复代码,但我仍然会在管理面板中有 2 个列表。
- 将来我可能会遇到同样的概念问题,但会更复杂,例如300 个类的某些东西和 1 个类应该只有 300 个中的一个的外键。
我该怎么办?
【问题讨论】:
-
为什么不在 Company 和 Customer 的模型中添加一个外键
address字段? -
搜索
party model。常见的模式。或者超类型,子类型stackoverflow.com/…
标签: python django database database-design foreign-keys