Дизайн базы данных - предотвращение дублирования для таблицы "Комната" - PullRequest
0 голосов
/ 28 января 2011

Привет всем, я пытаюсь создать базу данных для моего личного друга, и, учитывая мою неопытность в разработке баз данных, я испытываю затруднения при попытке создать базу данных, с которой я сейчас имею дело.По сути, моя проблема заключается в моей таблице «комнат», которая связана с другой таблицей, называемой «местоположение»;Местоположение - это все, что вы ожидаете (buildingID, streetAddress и т. Д.), И у Room есть внешний ключ, содержащий buildingId.Я хочу, чтобы в моей таблице "комнаты" были уникальные значения для номеров комнат на основе buildingId.

Чтобы дать вам более ясную идею, я просто отсканирую скрипт, который я использую для создания этих таблиц.

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

Любая помощь будет принята с благодарностью.* Спасибо.

1 Ответ

2 голосов
/ 28 января 2011

Уникальное ограничение на уровне таблицы?

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

Это также может быть уникальный индекс, который может включать столбцы INCLUDE

...