在以下典型示例中:
国家/地区与城市有一对多的关系 客户课程是否应仅提及城市或国家/地区?
public class City
{
public int CityId { get; set; }
public int CountryId { get; set; }
public virtual Country Country { get; set; }
...
}
public class Country
{
public int CountryId { get; set; }
public virtual ICollection<City> Cities { get; set; }
...
}
public class Customer
{
public int CustomerId { get; set; }
public int CityId { get; set; }
public int CountryId { get; set; }
public virtual City City { get; set; }
public virtual Country Country { get; set; }
...
}
通常,即使没有定义客户 - 国家/地区关系,我们也可以通过以下方式访问:
customer.city.country
我们也可以保持诚信。
但是,我经常看到人们添加明确的客户 - 国家/地区关系,因为 customer.city.country 很奇怪他们想要简单的 customer.country 。
或者在其他情况下,他们在中间创建地址类(值对象)。
什么是正确的方法?
答案 0 :(得分:1)
在大多数情况下,您只希望客户参考特定城市。通过使用他们的城市访问客户的国家不会在计算上太重,所以这不应该是一个主要问题。
更大的问题是您的数据完整性。如果客户的城市是芝加哥,但他们的国家是中国,会发生什么?通过两个引用,您必须处理更多的数据验证。
此外,对城市的单一引用遵循数据库规范化的规则。如果客户直接引用该国家/地区,您将违反第4种常规格式(具有可从其他属性派生的属性)。
虽然我们可以讨论拥有标准化数据库的优点,但在这种情况下,城市和国家之间的关系已经被定义,因此没有必要通过快捷方式重新定义这种关系。客户与国家之间的外键。