如何通过SQL表将SQL中的实体关联起来

时间:2014-05-15 18:53:29

标签: sql database database-design object-oriented-database

我是数据库设计的初学者,我需要为项目创建一个数据库。 我可以用面向对象的术语解释我想做什么,谢天谢地,数据库专家会很好地解释我如何在数据库方面处理这个问题。

我想创建一个与位置实体(州,城市)有关系的用户(Id,Name)实体。所以在编程语言中我想有以下

class User {
String Name;
Int Id;
Location location; }

class Location {
String State;
String City; }

有人可以解释我如何处理这件事吗?

3 个答案:

答案 0 :(得分:0)

取决于项目要求(设计)

关系可能如下:

*用户有一个位置,位置与一个用户(一对一关系)相关

*用户有一个或多个位置,位置与一个特定用户(一对多关系)相关

*用户有一个或多个位置,位置与用户(多对多关系)

相关

答案 1 :(得分:0)

表格表示关系,即关系。因此关系模型。即表中包含满足某些参数化语句的行。该语句的参数是表的列。

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,< =组合表来获得相应的表)。 DBMS可以为我们做这个转换。

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)IMPREIES EXISTS State,City Location(LocId,State,City)的情况,即USER PROJECT LocId< = Location PROJECT LocId那么我们说有一个从用户的LocId到位置的“包含约束”。如果{LocId}也是Location的键,那么还有一个从用户的LocId到Location的FK。我再说一遍,不需要这个查询;违反此规定的国家将永远不会因使用这些陈述而产生,除非是错误的。

您和其他评论者在这里遭受常见的混淆,这些混淆被教导为方法的错误表达,或者遗憾的是方法的实际部分。例如,“关系”被使用意味着对数据库中的表/关系的某些类型的约束。一个人混淆地说,用户和位置之间存在“一个”“很多:1”“关系”。这实际上意味着用户PROJECT Id,LocId即EXISTS名称用户(名称,Id,LocId)在用户之间(与Ids为1:1)和位置(与LocIds为1:1)具有多个属性:1,即许多用户可以位于某些数据库状态的相同位置。然后,这进一步与包含约束或从用户到位置的FK混淆。然后人们模糊地认为这样的事情“连接”表:但它们约束表(即数据库)并且与查询无关。

了解NIAM或FCO-IM或对象角色建模,它将告诉您如何清楚地思考设计。 (Halpin的书籍告诉你如何从ORM2映射到ER和其他人,而不会因常见的误解而扭曲。)

答案 2 :(得分:0)

根据评论看起来你想要的是Location表和User表之间的多对一关系。这意味着用户将只有一个位置,但可以为多个用户分配一个位置。所以你可以看看它应该是什么样子,我已经包含了以下DDL脚本,或者“数据定义语言”,这是所有数据库管理员使用的语言:

创建用户表:

CREATE TABLE [dbo].[User](
    [UserId] [int] NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [LocationId] [int] NOT NULL,
 CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
    [UserId] ASC
) ON [PRIMARY]
) ON [PRIMARY]

创建位置表:

CREATE TABLE [dbo].[Location](
    [LocationId] [int] NOT NULL,
    [City] [varbinary](50) NOT NULL,
    [State] [varchar](2) NOT NULL,
 CONSTRAINT [PK_Location] PRIMARY KEY CLUSTERED 
(
    [LocationId] ASC
) ON [PRIMARY]
) ON [PRIMARY]

现在在2.之间创建外键(FK).FK告诉数据库您要在两个表之间链接数据。也就是说,您无法将用户分配给位置表中不存在的位置。这是通过Id字段完成的。

ALTER TABLE [dbo].[User]  WITH CHECK ADD  CONSTRAINT [FK_User_Location] FOREIGN KEY([LocationId])
REFERENCES [dbo].[Location] ([LocationId])
GO
ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_User_Location]
GO

网上有很多用于学习数据库设计的好资源。你想早点回答的一个问题是“我想要如何规范我的数据库?” Database normalization会严重影响您的设计。

还有一件事:不要让你的应用程序对象模型决定你的数据库模型应该是什么。换句话说,您不需要在应用程序对象和数据库表之间建立一对一的关系。对于非常小的数据库来说可能是这种方式,但是使用数据库设计的最佳实践,您很快就会发现这是一种不可持续的实践。