在以下示例中,维护类(表)之间关系的正确方法是什么?

时间:2016-08-07 12:58:25

标签: database-design

在以下典型示例中:

国家/地区城市有一对多的关系 客户课程是否应仅提及城市国家/地区

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
或者在其他情况下,他们在中间创建地址类(值对象)。

什么是正确的方法?

1 个答案:

答案 0 :(得分:1)

在大多数情况下,您只希望客户参考特定城市。通过使用他们的城市访问客户的国家不会在计算上太重,所以这不应该是一个主要问题。

更大的问题是您的数据完整性。如果客户的城市是芝加哥,但他们的国家是中国,会发生什么?通过两个引用,您必须处理更多的数据验证。

此外,对城市的单一引用遵循数据库规范化的规则。如果客户直接引用该国家/地区,您将违反第4种常规格式(具有可从其他属性派生的属性)。

虽然我们可以讨论拥有标准化数据库的优点,但在这种情况下,城市和国家之间的关系已经被定义,因此没有必要通过快捷方式重新定义这种关系。客户与国家之间的外键。