C# 遍历多个表的数据库关系

C# 遍历多个表的数据库关系,c#,entity-framework,database-design,C#,Entity Framework,Database Design,我想在绩效方面进一步阐述。数据库模式为: 制造 马克伊德 化名 模型 模型ID 型号名称 MakeId(FK) 车辆 车辆ID 购买日期 模型ID(FK) 如果我想知道车辆的品牌,我需要使用Vehicle.Model.Make遍历模型表。假设我没有三个表,而是4或5个表,它们以这种方式连接,因此我必须编写例如InvoiceForVehicle.Vehicle.Model.Make。我认为这会导致查询性能差 我可以在InvoiceForVehicle表中添加一个额外的列MakeId(F

我想在绩效方面进一步阐述。数据库模式为:

制造

  • 马克伊德
  • 化名
模型

  • 模型ID
  • 型号名称
  • MakeId(FK)
车辆

  • 车辆ID
  • 购买日期
  • 模型ID(FK)
如果我想知道车辆的品牌,我需要使用Vehicle.Model.Make遍历模型表。假设我没有三个表,而是4或5个表,它们以这种方式连接,因此我必须编写例如InvoiceForVehicle.Vehicle.Model.Make。我认为这会导致查询性能差

我可以在InvoiceForVehicle表中添加一个额外的列MakeId(FK),它直接进入make。这意味着我有重复的数据,每次更改InvoiceForVehicle和车辆之间的关系时,我都必须相应地更新MakeId(FK)

车辆发票

  • 发票ID
  • 日期创建
  • 车辆ID(FK)
  • MakeId(FK)

这是个好主意吗?

我怀疑您是否会看到很多成功案例(如果有的话),因为您将通过ID引用,而不是进行任何实际搜索

我认为(根据我的知识),您现有的模型比新提出的解决方案结构更正确。您不应该像新的解决方案所允许的那样,将自己置于可能丢失数据完整性的情况下

来回答你的问题。不,我认为这个新主意不是一个好办法。基于数据库标准形式,您现有的设置更“正确”。另外,由于
实体框架
延迟加载数据,您实际上不会运行任何不需要的查询。

出于性能原因:可能会

出于一致性原因:

按照您的建议,将有可能使车辆连接到与该车辆(型号)不对应的品牌


您可以尝试一直使用复合(可能是自然)键,并使用相应的复合外键。在这种情况下,重要的外键是从
车辆(MakeId,ModelId)
模型(MakeId,ModelId)

此查询多久调用一次?它必须是实时的,还是类似于一直访问的月度/每日报告?有多少条记录?我认为表Make大约有10k行,每个表有3个模型,每个表有3个车辆,以此类推。查询InvoiceForVehicle时,几乎总是可以访问InvoiceForVehicle的品牌。大约有50个用户同时使用数据库。当前查询需要多长时间才能返回?@Woot4Moo:我必须承认,我们目前正在应用程序中使用后一个选项(“重复”FKs):(.为了简单起见,我反过来问了这个问题。因此,也许我们应该删除“重复”键,并分析一些经过调整的查询,以决定是否可以返回到一致的数据库架构,而不会降低太多性能?我认为您太害怕联接。正确编制索引并审核执行计划。您将好吧。我真的很想避免使用复合键。但我认为在这种情况下它们会提供一致性,对吗?是的,你是对的。(只要你也使用复合外键。但你已经知道了。)@Jared:嗯,我的观点主要是关于一致性。也许你的评论真的应该针对这个问题?是的。我认为我们基本上说了同样的话。你的设计包括一个替代的db设计。但是,即使没有考虑EF。在你有发票的时候,你也会把其他表从列表中删除ID,而不是“真的”搜索,我只是不认为他已经拥有的任何东西会有什么好处。但我并没有攻击你的答案,如果答案是那样的话,我很抱歉。如果有适当的连接/索引,他会很好。