데이터베이스 디자인/모델링 질문 - 제약 또는 제약 조건이 없습니까?
-
18-09-2019 - |
문제
다음 구조가 주어지면 :
City
Area
User
모든 지역에는 1과 1 개의 도시 만 있습니다.
모든 사용자는 하나 이상의 여러 영역을 가지고 있습니다.
모든 사용자는 1과 1 도시 만 있습니다.
이것을 모델링하는 가장 우아한 방법은 무엇입니까?
현재는 다음과 같습니다.
User,
UserArea,
Area,
City
여기서 userArea는 1 : m 관계와 사용자와 지역이 1 : 1입니다.
문제는 이것입니다.
사용자는 현재 모델에 3 ~ 4 개의 영역을 가질 수 있지만 2 개 지역은 도시 "1"에있을 수 있고 다른 2 개 영역은 도시 "2"에있을 수 있습니다. 이것은 비즈니스 규칙을 위반 한 것입니다.
이런 종류의 일을 방지하기 위해 제약 조건을 제한해야합니까, 아니면 이러한 유형의 역설이 불가능하도록 더 이상 정상화하는 더 나은 접근 방식입니까? 그렇다면이 시스템을 어떻게 모델링하여
1 사용자 = 1 도시;
1 영역 = 1 도시;
1 사용자 = M 영역;
통찰력에 감사드립니다.
해결책 7
이 답변은 sqlservercentral에서 나에게 제공되었으며, 내가 찾고 있던 일을 정확하게 수행합니다. 이 포럼에서 Rexum이 지적한 것처럼 중복성이 있지만 아노 몰리의 가능성은 없습니다.
귀하의 의견과 제안에 매우 관심이 있습니다.
CREATE TABLE [dbo].[Cities](
[CityID] [int] IDENTITY(1,1) NOT NULL,
[CityName] [varchar](50) NOT NULL,
CONSTRAINT [PK_Cities] PRIMARY KEY CLUSTERED
(
[CityID] ASC
)
)
CREATE TABLE [dbo].[Users](
[UserID] [int] IDENTITY(1,1) NOT NULL,
[UserName] [varchar](50) NOT NULL,
[CityID] [int] NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[UserID] ASC
)
)
ALTER TABLE [dbo].[Users] WITH CHECK ADD CONSTRAINT [FK_Users_Cities] FOREIGN KEY([CityID])
REFERENCES [dbo].[Cities] ([CityID])
GO
ALTER TABLE [dbo].[Users] CHECK CONSTRAINT [FK_Users_Cities]
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_UsersCity] ON [dbo].[Users]
(
[UserID] ASC,
[CityID] ASC
)
CREATE TABLE [dbo].[Areas](
[AreaID] [int] IDENTITY(1,1) NOT NULL,
[AreaName] [varchar](50) NOT NULL,
[CityID] [int] NOT NULL,
CONSTRAINT [PK_Areas] PRIMARY KEY CLUSTERED
(
[AreaID] ASC
))
GO
ALTER TABLE [dbo].[Areas] WITH CHECK ADD CONSTRAINT [FK_Areas_Cities] FOREIGN KEY([CityID])
REFERENCES [dbo].[Cities] ([CityID])
GO
ALTER TABLE [dbo].[Areas] CHECK CONSTRAINT [FK_Areas_Cities]
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_AreasCity] ON [dbo].[Areas]
(
[AreaID] ASC,
[CityID] ASC
)
GO
CREATE TABLE [dbo].[UserCityArea](
[UserID] [int] NOT NULL,
[CityID] [int] NOT NULL,
[AreaID] [int] NOT NULL,
CONSTRAINT [PK_UserCityArea] PRIMARY KEY CLUSTERED
(
[UserID] ASC,
[CityID] ASC,
[AreaID] ASC
)
)
GO
ALTER TABLE [dbo].[UserCityArea] WITH CHECK ADD FOREIGN KEY([UserID], [CityID])
REFERENCES [dbo].[Users] ([UserID], [CityID])
GO
ALTER TABLE [dbo].[UserCityArea] WITH CHECK ADD FOREIGN KEY([AreaID], [CityID])
REFERENCES [dbo].[Areas] ([AreaID], [CityID])
다른 팁
사용자, 지역 및 도시를위한 테이블이 각각있는 다음 사용자 및 도시 (조합)가 독특한 것으로 제한되는 열 사용자 (FK), 도시 (FK) 및 지역 (FK)이있는 네 번째 테이블이 있습니다. 그런 다음 사용자 영역 조합이 삽입 될 때마다 비 유니크 도시를 허용하지 않습니다.
내가 생각할 수있는 유일한 것은 다음과 같습니다.
지역 테이블에 CityID와 AreaID의 복합 대체 키를 제공하십시오. AreaId Primary를 만들기 (따라서 하나의 도시만 가질 수 있음).
이 대체 키 (AK1)를 사용하여 면적과 사용자 영역 사이의 FK 관계를 형성하십시오.
사용자 테이블에 userID 및 CityID의 복합 대체 키를 제공하십시오. userID 기본을 만듭니다.
이 대체 키 (AK2)를 사용하여 사용자와 사용자 영역 사이의 FK 관계를 형성하십시오.
따라서 사용자 영역 테이블은 다음과 같습니다.
userid cityid areatId
AK2 기반의 외국 키는 사용자의 고향과 일치하는 도시를 선택하도록 강요 할 것이며 AK1 기반 외국 키는 해당 도시에 속한 지역을 선택하도록 강요합니다. 본질적으로 AK1 및 AK2 외국 키는 겹쳐서 원하는 것을 강요합니다.
귀하의 "사용자, 사용자 영역, 지역, 도시"접근 방식이 정확하다고 생각합니다. 위반을 방지하기 위해 제약 및 비즈니스 논리에 의존하십시오.
영역이 무엇인지에 대한 자세한 내용을 제공 할 수 있습니까? 내 가정을 말씀 드리겠습니다.
사용자는 도시에 산다.
모든 도시에는 지역이 있습니다.
지역은 한 도시에만 떨어질 수 있습니다.
사용자는 한 도시에서만 살 수 있습니다
이러한 조건이 주어지면 설계 사양에 다음과 같은 기능적 종속성이있는 것 같습니다.
지역 -> 도시
사용자 -> 도시
비즈니스 모델은 사용자가 같은 도시 내에 여러 주소를 가질 수 있지만 두 도시에서 주소를 가질 수는 없습니다. 이것이 현실적인 디자인 제약입니까? 여러 주소를 가질 수 있다면 다른 도시에서는 왜 그렇지 않습니까?
주어진 사용자의 모든 영역을 저장하려면 세 번째 테이블이 필요합니다 (제안한 것처럼). 테이블은 모양이 될 것입니다
userArea (userId, atreatId). 트리거 또는 저장 프로 시저를 사용하여 비즈니스 로직을 구현해야합니다.
USER_AREAS
다음 열만 필요합니다.
USER_ID
(PK, FKUSERS.USER_ID
)AREA_ID
(PK, FKAREA.AREA_ID
)
지역은 지역 테이블의 한 도시와 관련이 있습니다. 지역 테이블에서 롤업하여 어떤 도시가 사용자와 관련이 있는지 알고 있습니다.
AREA
AREA_ID
(PK)CITY-ID
(FKCITY.CITY_ID
)
퍼팅 CITY_ID
에서 USER_AREAS
테이블은 중복됩니다. 둘째, 배치 CITY_ID
에서 USER_AREAS
테이블은 AREA_ID
그 기록에서 실제로는 관련이 있습니다 CITY_ID
지역 테이블에서. 체크 제한 조건은 열에서 허용되는 값을 제한함으로써 도메인 무결성을 시행하며 다른 테이블에서 열을 참조 할 수 없으면 사용자 정의 된 기능이 적어야합니다.
데이터베이스의 단일 도시에만 속한 사용자 영역의 비즈니스 규칙을 시행 할 수 없습니다. 응용 프로그램 수준에서 수행해야합니다 (Sproc은 무엇이든 삽입/업데이트를 관리합니다. USER_AREAS
테이블).
나는 당신이 "영역"이 무엇을 의미하는지 잘 모르겠습니다.
나는 도시 부문이 다음과 같다고 생각합니다.
지구에는 나라가 있습니다. 국가에는 지역 (주, 지방 등)이 지역 (도시, 마을, 마을 등)이있는 지역 (충분히 큰 경우)이 지구를 가질 수 있습니다.
user => 국가 + 지역/지역 + 도시 ( + 지구)
지역에 대해 자세히 설명해 주시겠습니까?