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

如何通过SQL表关联SQL中的实体,sql,database,database-design,object-oriented-database,Sql,Database,Database Design,Object Oriented Database,我是数据库设计的初学者,我需要为一个项目创建一个数据库。 我可以用面向对象的术语解释我想做什么,谢天谢地,一位数据库专家会很好心地解释我如何在数据库方面处理这个问题 我想创建一个用户(Id,Name)实体,它将与一个位置实体(state,city)建立关系。因此,在编程语言中,我希望有以下内容 class User { String Name; Int Id; Location location; } class Location { String State; String City; }

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

我想创建一个用户(Id,Name)实体,它将与一个位置实体(state,city)建立关系。因此,在编程语言中,我希望有以下内容

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

class Location {
String State;
String City; }

有人能解释一下我该怎么处理这件事吗

这取决于您的项目要求(设计)

关系可能如下所示:

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

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


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

表表示关系。因此建立了关系模型。Ie表包含满足某些参数化语句的行。语句的参数是表的列

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、MENUS、PROJECT-OUT等组合表,可以获得相应的表。根据注释,看起来您想要的是位置表和用户表之间的多对一关系。这意味着一个用户将只有一个位置,但一个位置可以分配给多个用户。因此,您可以看到这应该是什么样子,我已经包括了以下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
网络上有很多学习数据库设计的好资源。您希望尽早回答的一个问题是“我希望如何规范化我的数据库?”这将严重影响您的设计


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

我的关系是,一个用户可能有一个位置,一个位置可能分配给最多一个用户(就设计而言)。这个实现真让我抓狂!:)我可以看到一个包含城市和州主键的位置表,但我看不到如何将其与用户表连接。嗯,你想用一个表绑定两个表吗??你知道外键吗?我看到的一个解决方案是创建一个包含state和city列的用户表,但这是处理这个问题的正确方法吗?通过这样做,如果我在用户(如公司)之外获得了更多与位置相关的元素,然后我想在位置上添加另一个属性(如国家),那么我必须转到每个使用位置的表并手动添加新属性。我认为这不是很有效,请通过编辑而不是评论来澄清。
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