如何设计表支持与默认值有很多关系?

问题描述 投票:1回答:2

如何设计支持表与默认值有很多关系?

例如: 国家有很多城市。一个城市是该国家的默认城市。

表设计选项1: City表将具有布尔字段 - is_default。

表设计选项2: 国家/地区表将具有外键字段 - default_city。

将写入的查询: 更新并获取默认城市并更改默认城市。

哪个选项更好,为什么?

预先感谢。

sql database-design has-many
2个回答
1
投票

这个问题有哲学方面和实践方面。

哲学问题是“哪个实体应该知道默认状态 - 国家或城市?”。一个国家可以没有默认城市吗? “默认”是您可以与城市关联的属性吗?是否还有其他属性可能适用于城市与国家之间的关系?

哲学问题很重要,因为将来,如果没有参与初始对话,那么查看此模式的人应该能够理解意图,而无需阅读文档。

顺便说一下,我不知道答案,但是值得与你的团队进行这次对话 - 我相信默认解决方案应该是“做最符合领域模型的事情”。

然后,有一些实际问题。

正如@SaadAhmad所写,如果“默认城市”作为国家的属性,并且您想强制要求,则在创建国家之前必须存在城市记录,这是不可能的,因为“country”是“city”的必填字段。

另一个实际问题是“我如何执行一个国家必须拥有1个且只有1个默认城市的业务规则”?通过在国家/地区创建“默认城市”作为非空字段很容易,但很难将“is_default”作为城市的属性 - “country_id,is_default”的唯一索引意味着每个国家/地区只能有一个默认城市,但不强制执行必须至少为1的规则。

所以,答案是:

  • 找出业务领域首先告诉你的内容。
  • 使“is_default”成为城市的一个属性几乎是最容易的,因为在创建国家时你不必担心城市存在。
  • 您必须处理业务规则,要求每个国家/地区只有一个默认城市

1
投票

从长远来看,随着用途的发展,在国内存储城市可能并不是最好的。最好有城市的属性。然后,而不是布尔值使它成为一个代码,其中1表示默认。后来其他城市可能会开始承载其他属性,如金融资本,资本等。因此,给予城市他们的属性可能更好。

例如,公司有员工,一名员工是CEO。因此,员工和公司的员工头衔都要低于员工的实体。

此外,在创建国家/地区记录时,由于城市尚不存在,您将无法创建记录。您将其留空,创建城市,然后返回设置默认值。

© www.soinside.com 2019 - 2024. All rights reserved.