首先,我想举个例子。在这里,我将使用 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_Id
和Site_Id
用于建立网站表与公司之间的关系表
之后,当我创建 Line 表时,我应该同时使用
Company_Id
和Company_Id
?
我知道我只能使用Site_Id
,通过查询,我可以获得公司所属的网站。但最佳做法是什么?我应该使用每个表Site_Id
还是仅使用上一个表Id
?
如果有人可以提供Id
。
答案 0 :(得分:1)
不,你不应该让层次结构中的每个表都有来自其上面每个表的每个ID,因为我们可以使用连接在整个层次结构链中将表链接在一起。
可能存在非常有限的情况,其中具有较低级别表的ID特别有利于其上方的ID,嵌入其中但是它通常是开发人员的便利,当他们想到的时候,每当我想知道哪台机器属于哪家公司时,我就无法加入这27张桌子。我只是在机器表中有一个公司代码,我保证我会通过一些复杂的机制更新它,并且#34; ..
..不要这样做..当你将网站卖给另一家公司时,你必须记住将所有机器都转移给他们,不仅仅是通过销售网站,而是访问每台机器并更新其公司ID,否则层次结构搞砸了
如果您的前端应用每秒查询一百万次机器属于哪家公司,并且您不希望数据库必须将27个表连接在一起,那么另一种选择是什么?百万次一秒,找到这个?高速缓存;一个单独的系统,您可以在其中维护一系列机器和公司。每次销售某些东西或进行传输时,在更新数据库层次结构的一部分时都会使缓存失效。在下一次查询时,缓存未命中,并将使用新信息重建。数据库偶尔只需加入27个表
这已经开始进入一个观点,因此超出了SO问题/答案的范围,但如果您在实施系统时遇到特定问题,请随时发布
Ps:不要在表格前加上tbl;它显而易见的是它们。那些必须给所有东西起名字的日子,幸运的是它早已不复存在了