Database design 实体与关系集

Database design 实体与关系集,database-design,relational-database,entity-relationship,erd,Database Design,Relational Database,Entity Relationship,Erd,我对“实体集”和“关系集”感到困惑。我知道“实体”和“关系”。对于实体集和关系集,是否有任何清晰的示例来显示这些术语的实际用例 ___________ /\ ___________ | | / \ | | | Teacher |-------- /Tea \--------| Student | |___________| \che /

我对“实体集”和“关系集”感到困惑。我知道“实体”和“关系”。对于实体集和关系集,是否有任何清晰的示例来显示这些术语的实际用例

 ___________            /\           ___________ 
|           |          /  \         |           |
|  Teacher  |-------- /Tea \--------|  Student  |
|___________|         \che /        |___________|
                       \s /                      
                        \/                       

在上图中,教师和学生是实体,教师是关系。

实体集通常可见(通过
DbSet
ICollection
)而关系集在使用Linq转换实体时看起来像是隐藏的。您可以访问集合的导航属性,查询某些实体,实体集非常直观

对于关系集,它不太可见。实际上,所谓的
导航属性
表示关系。关系包含关于两端的信息,因此看起来像链接。实体看起来像两个端点之一

例如:您有两名教师T1、T2和两名学生S1、S2。这取决于关系的类型,可以有不同的关系集

  • 对于一个关系,假设T1教S1,T2教S2。因此,关系集只包含两个条目:(T1-S1)、(T2-S2)。此关系通过两个表之一中定义的外键列维护:
    Teacher
    Student
    。在代码中,只需更改导航属性(参考)即可修改/建立关系:

  • 对于一个多关系,假设T1教授S1,S2和T2保留(不教授学生)。我们还有两个关系:(T1-S1),(T1-S2)。这种关系是通过多方表中定义的外键列来维护的(在本例中是
    Student
    )。
    Teacher
    然后公开
    Student
    的集合,而
    Student
    仅公开对
    教师的引用。在代码中,您可以通过更改以下导航属性之一来修改/建立关系:

    //via Teacher navigation property
    S1.Teacher = T1;
    S2.Teacher = T1;
    //or via Students navigation property
    //NOTE: this is for demonstration, in practice doing something
    //like this should be done carefully.
    //Students should be fully loaded first, otherwise 
    //if lazy loading is enabled, the new list will be merged with  
    //loaded data before being set to Students.
    //This may null out some foreign keys (if foreign key column is nullable)
    //Otherwise an exception will be thrown after calling SaveChanges()
    T1.Students = new List<Student>{ S1, S2 };
    
    //Setting collection navigation property 
    //like this has the same note as above (about merging collection)
    //However there won't be no exception
    //It's easier than one-many relationship.
    S1.Teachers = new List<Teacher> { T1, T2};
    S2.Teachers = new List<Teacher> { T1, T2};
    //or 
    T1.Students = new List<Student> { S1, S2};
    T2.Students = new List<Student> { S1, S2};
    

上面的代码主要用于演示目的(尽管在某些特定场景/上下文中工作)。实际上,您可以使用集合导航属性的
删除
清除
添加
方法来修改集合导航属性。还可以从数据库中查询列表值(而不是创建新的列表值)。最值得注意的是在修改一对多关系的集合导航属性时。修改/更改这种关系的引用导航属性更安全。

最初在实体关系建模中:实体是一个单独的东西。某些事物之间的关系或它们之间的联系是一个单独的(具体的或概念性的)事物。两者都可以有属性。实体或关系/关联类型/集/类是实体或关系/关联的集合。类型/集/类对应于一个关系,并且每个实体或作为元素/成员的关系/关联包含一行。实体或关系/关联称为其为元素/成员的类型/集合/类的实例

然而,“实体”被用作“实体类”的缩写,“关联”被用于“关联类”。这当然令人困惑。然后“实体实例”用于“实体”,而“类实例”用于“类”。更令人困惑的是。这意味着我们可以看到实体或关系“set/class instance”表示实体或关系。啊。但实体或关联“类型”被用来表示一组或一组可能被称为潜在事物的集合,实体和关系/关联集/类表示实际与当前情况/状态下的事物相对应的潜在元素/类型成员。(就像一个关系的行“类型”意味着所有可能存在的元组的集合,而一个关系是一组实际存在的元组。或者像类和范围。)ughnnn。你只需要弄清楚作者是如何使用术语的

许多演示文稿或支持E-RM或变体的产品也错误地使用“关系”来表示“外键”

Boo是教师是实体(实例)的示例当且仅当Boo是教师时。
Gee是学生是实体(实例)的示例当且仅当Gee是学生时。
Boo教授Gee是一种关系/关联(实例),当且仅当Boo教授Gee时。
教师是一个实体类型/集合/类,包含所有此类实体(实例)。
Student是一个实体类型/集合/类,包含所有此类实体(实例)。
是一种关系/关联类型/集合/类,包含所有此类关系/关联(实例)。
矩形表示实体类型/集合/类别。
菱形表示关系/关联类型/集合/类别。
矩形和菱形对应关系
(具有参与者物品加上拥有/拥有/关联财产物品的属性)。
从菱形到矩形的直线表示实体类型/集合/类别参与关系/关联类型/集合/类别的关系/关联
(以及从关系/关联关系到参与者实体关系的外键)

具有讽刺意味的是,所有这些术语的变化和混淆都是指那些本来就不必要的概念。E-RM在“实体”事物、“关系/关联”事物和“财产”事物之间,以及作为财产和与之存在关系/关联之间,做出了不必要的区分。直接建模可以避免所有这些。每个查询的每个超键都与某种类型的事物1:1对应。但是E-R建模和变体并不理解关系模型

请参见。

请用“实体”和“关系”来表达您的意思。它们经常被用来表示“实体集”和“关系集”!(最好不要使用空泛的词语,而是使用“实体实例”、“关系”
//Setting collection navigation property 
//like this has the same note as above (about merging collection)
//However there won't be no exception
//It's easier than one-many relationship.
S1.Teachers = new List<Teacher> { T1, T2};
S2.Teachers = new List<Teacher> { T1, T2};
//or 
T1.Students = new List<Student> { S1, S2};
T2.Students = new List<Student> { S1, S2};