【问题标题】:Database Design - Preventing duplications for "Room" table数据库设计 - 防止“房间”表的重复
【发布时间】:2011-01-28 09:10:21
【问题描述】:

大家好,我正在尝试为我的一个私人朋友创建一个数据库,但鉴于我缺乏开发数据库的经验,我在尝试建立一个我目前正在处理的数据库时遇到了困难。从本质上讲,我的问题在于我的“房间”表与另一个名为“位置”的表有关联;位置就是您所期望的一切(buildingID、streetAddress 等),并且 Room 有一个包含 buildingId 的外键。我希望我的“房间”表具有基于 buildingId 的房间号的唯一值。

为了让您更清楚地了解,我将 c&p 我用来创建这些表的脚本。

CREATE TABLE [dbo].[Location](
 [buildingId] [int] IDENTITY(1,1) NOT NULL,
 [streetAddress] [varchar](50) NOT NULL,
 [postalCode] [varchar](7) NOT NULL,
 [province] [varchar](30) NOT NULL,
 [city] [varchar](30) NOT NULL,
 CONSTRAINT [PK_Location] PRIMARY KEY CLUSTERED 
(
 [buildingId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [UN_postalCode] UNIQUE NONCLUSTERED 
(
 [postalCode] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [UN_streetAddress] UNIQUE NONCLUSTERED 
(
 [streetAddress] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]



CREATE TABLE [dbo].[Room](
 [rmId] [int] IDENTITY(1,1) NOT NULL,
 [roomNum] [varchar](10) NOT NULL,
 [floor] [int] NOT NULL,
 [capacity] [int] NOT NULL,
 [permission] [bit] NOT NULL,
 [buildingId] [int] NOT NULL,
 CONSTRAINT [PK_Room_1] PRIMARY KEY CLUSTERED 
(
 [rmId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Room]  WITH CHECK ADD  CONSTRAINT [FK_Room_Location] FOREIGN KEY([buildingId])
REFERENCES [dbo].[Location] ([buildingId])
GO

ALTER TABLE [dbo].[Room] CHECK CONSTRAINT [FK_Room_Location]
GO

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: database sql-server-2005 sql-server-2008 database-design data-structures


    【解决方案1】:

    表级唯一约束?

    ALTER TABLE dbo.Room WITH CHECK ADD
        CONSTRAINT UQ_Room_RoomBuildingLocation UNIQUE (roomNum, buildingId)
    

    这也可以是允许包含列的唯一索引

    【讨论】: