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

Database design 在下面的示例中,维护类(表)之间关系的正确方法是什么?,database-design,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; s

在以下典型示例中:

国家城市有一对多的关系
客户类是否应仅参考城市或国家

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; }
    ...
}
公共级城市
{
public int CityId{get;set;}
public int CountryId{get;set;}
公共虚拟国家{get;set;}
...
}
公营国家
{
public int CountryId{get;set;}
公共虚拟ICollection城市{get;set;}
...
}
公共类客户
{
public int CustomerId{get;set;}
public int CityId{get;set;}
public int CountryId{get;set;}
公共虚拟城市城市{get;set;}
公共虚拟国家{get;set;}
...
}
通常,即使不定义客户与国家/地区的关系,我们也可以通过以下方式访问:
客户、城市、国家
我们也可以保持完整性

然而,我经常看到人们添加明确的客户-国家关系,因为Customer.city.Country很奇怪,他们想要简单的Customer.Country。
或者在其他情况下,它们会在两者之间创建一个地址类(值对象)


正确的方法是什么?

在大多数情况下,您只希望客户有一个特定城市的参考。通过使用客户所在的城市访问客户所在的国家/地区在计算上不会很繁重,因此这不应成为主要问题

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

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


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

有没有可能在不了解客户所在城市的情况下了解客户所在的国家?@davidadridge你怎么看?这是一个一般的设计问题,不是我真正的问题。如果我们让它成为可能,那么我们将失去完整性。客户可以将美国作为国家,伦敦作为城市(除非我们总是在服务器中检查验证)。易用性很重要,但不如数据完整性重要。还有,是什么阻止了任何人开发客户端类来公开Customer.Country属性,而这些属性在内部只会给出Customer.City.Country的结果?@EhsanShirazi我认为这两者都是可能的。有时你知道高级信息而不知道低级信息。如果这是一个面向对象的设计问题,我会说这种关系可能是多态的,因此您可以将客户直接链接到城市或国家。如果你一直都知道这个城市,那就链接到那里。“正确的方法”完全取决于设计理念。在第3段中,您的意思是:直接引用城市或国家的客户违反4NF?直接引用国家的客户将违反4NF,假设“真实关系”是在客户和城市之间。这是因为国家和客户之间的关系可以通过使用客户和城市之间的关系以及城市和国家之间的关系来确定。那么我认为您应该编辑该段。因为你写了“如果客户直接提及城市,你将违反第四标准表”。