一个表代表一个关系,也就是关系。因此,关系模型。即一个表包含满足某些参数化语句的行。语句的参数是表的列。
table User on Name, Id, LocId
// (longhand) "user identified by [Id] has name [Name] and is located in location [LocId]"
// (shorthand) User(Name,Id,LocId)
table Location on LocId, State and City
// (longhand) "location [LocId] is city [City] in state [State]"
// (shorthand) "Location(LocId,State,City)
通过使用 AND、OR、AND NOT、EXISTS、IMPLIES 等组合语句获得满足其他语句的行。通过使用 JOIN、UNION、MINUS、PROJECT-OUT、
User
// rows satisfying User(Name,Id,LocId)
User JOIN Location
// rows satisfying User(Name,Id,LocId) AND Location(LocId,State,City)
User PROJECT-OUT LocId
// ie User PROJECT Name,Id
// rows satisfying EXISTS LocId User(Name,Id)
User WHERE Name='Fred'
// rows satisfying User(Name,Id,LocId) AND Name='Fred'
这就是表/语句“连接”的方式:通过参数/列名和逻辑/关系运算符。
只有您可以决定要在表中包含哪些行,即您希望从哪些语句中组合查询。
您用关系的某些属性回答了另一个答案(本身对关系感到困惑),但您没有说明这些关系实际上是什么,并且不足以知道表中的内容或行中的哪些语句一个查询结果满足。
请注意,这就是您更新和查询数据库所需的全部内容。
考虑到一些陈述和可能出现的情况,数据库只会处于某些状态。我们通过“约束”告诉 DBMS,这样它就可以防止其他状态并优化执行。例如,如果总是存在 EXISTS Name,Id User(Name,Id,LocId) IMPLIES EXISTS State,City Location(LocId,State,City) 即 USER PROJECT LocId
您和这里的其他评论者经常遇到混淆,这些混淆被认为是对方法的错误表述,或者不幸的是方法的实际部分。例如,使用“关系”来表示对数据库中的表/关系的某些类型的约束。有人困惑地说用户和位置之间存在“a”“many:1”“关系”。这实际上意味着用户(与 Ids 为 1:1)和位置(与 LocIds 为 1:1)之间的表/关系 User PROJECT Id,LocId 即 EXISTS Name User(Name,Id,LocId) 具有多:1的属性,即在某些数据库状态下,许多用户可以位于同一位置。然后这与从用户到位置的包含约束或 FK 进一步混淆。然后人们就模糊地认为这样的东西“连接”了表:但它们约束表(即数据库)并且与查询无关。
阅读有关 NIAM 或 FCO-IM 或对象角色建模的信息,它们将告诉您如何清晰地思考设计。 (Halpin 的书告诉您如何从 ORM2 映射到 ER 和其他,而不会因常见的误解而扭曲。)