想了解数据库设计和表关系的最佳实践

时间:2017-08-23 05:04:41

标签: c# sql entity-framework database-design code-first

首先,我想举个例子。在这里,我将使用 code first 方法来创建数据库表及其关系。请查看下面的.gradle/**/*.bin .gradle/**/*.lock 。 (class

C#

您会注意到我将两个导航属性(Blog.Posts和Post.Blog)设为虚拟。这启用了Entity Framework的延迟加载功能。延迟加载意味着当您尝试访问这些属性时,这些属性的内容将自动从数据库加载。

现在这是我的问题。

我想创建一个数据库,如下所示。表名将是:

public class Blog { public int BlogId { get; set; } public string Name { get; set; } public virtual List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public virtual Blog Blog { get; set; } }

tblCompany tblSite

// Site will be create under Company (A Company will have one or more Sites). tblLine

// Line will be create under Site (A Site will have one or more Lines). tblMachine

  
    

所以我会创建,

         

公司表,它将有一个// Machine will be create under Line (A Line will have one or more Machines).

  

  
    

然后我会创建,

         

网站表格,此表格将Company_IdSite_Id用于建立网站表与公司之间的关系表

  

  
    

之后,当我创建 Line 表时,我应该同时使用Company_Id      和Company_Id

  

我知道我只能使用Site_Id,通过查询,我可以获得公司所属的网站。但最佳做法是什么?我应该使用每个表Site_Id还是仅使用上一个表Id

如果有人可以提供Id

1 个答案:

答案 0 :(得分:1)

不,你不应该让层次结构中的每个表都有来自其上面每个表的每个ID,因为我们可以使用连接在整个层次结构链中将表链接在一起。

可能存在非常有限的情况,其中具有较低级别表的ID特别有利于其上方的ID,嵌入其中但是它通常是开发人员的便利,当他们想到的时候,每当我想知道哪台机器属于哪家公司时,我就无法加入这27张桌子。我只是在机器表中有一个公司代码,我保证我会通过一些复杂的机制更新它,并且#34; ..

..不要这样做..当你将网站卖给另一家公司时,你必须记住将所有机器都转移给他们,不仅仅是通过销售网站,而是访问每台机器并更新其公司ID,否则层次结构搞砸了

如果您的前端应用每秒查询一百万次机器属于哪家公司,并且您不希望数据库必须将27个表连接在一起,那么另一种选择是什么?百万次一秒,找到这个?高速缓存;一个单独的系统,您可以在其中维护一系列机器和公司。每次销售某些东西或进行传输时,在更新数据库层次结构的一部分时都会使缓存失效。在下一次查询时,缓存未命中,并将使用新信息重建。数据库偶尔只需加入27个表

这已经开始进入一个观点,因此超出了SO问题/答案的范围,但如果您在实施系统时遇到特定问题,请随时发布

Ps:不要在表格前加上tbl;它显而易见的是它们。那些必须给所有东西起名字的日子,幸运的是它早已不复存在了