如何理清AdventureWorks 2019中复杂的实体关系?
理解这几个表关系的合理性
先拆解这几个关系对应的实际业务逻辑,就能明白设计的意义:
SalesTerritory与SalesOrderHeader的一对多:每个销售订单必然归属某个特定销售区域(比如华东区、华北区),一个区域下会对应大量订单,这是订单的「归属区域」属性。SalesTerritory与SalesPerson的一对多:每个销售人员会被分配到特定销售区域,一个区域可以有多名销售负责,这是销售的「负责区域」属性。SalesPerson与SalesOrderHeader的一对多:每个订单由具体销售人员跟进成交,一名销售会对应多个自己经手的订单,这是订单的「归属销售」属性。
你觉得会形成多对多,是混淆了两个不同的关联逻辑:SalesOrderHeader里的TerritoryID是订单本身的区域属性,而SalesPerson的TerritoryID是销售的负责区域。两者通常会重合(销售接自己负责区域的订单),但设计也允许例外场景——比如销售临时跨区域接手订单,此时订单的TerritoryID和销售的TerritoryID可以不同,这种灵活性正好匹配真实业务需求。
写查询时只要明确目标逻辑就不会混乱:
- 查「某个区域下的所有订单」,直接关联
SalesTerritory和SalesOrderHeader的TerritoryID; - 查「某个销售经手的所有订单」,关联
SalesPerson和SalesOrderHeader(通常是通过SalesPersonID而非TerritoryID,若用TerritoryID则是筛选该销售负责区域内的订单); - 查「某个区域下,该区域销售经手的订单」,同时关联三个表,用
SalesTerritory.TerritoryID关联SalesPerson.TerritoryID,再对应关联SalesOrderHeader的字段。
内容的提问来源于stack exchange,提问作者Paul Kersey
相关产品推荐
相关产品推荐

