데이터베이스 디자인/모델링 질문 - 제약 또는 제약 조건이 없습니까?

StackOverflow https://stackoverflow.com/questions/1155058

  •  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, FK USERS.USER_ID)
  • AREA_ID (PK, FK AREA.AREA_ID)

지역은 지역 테이블의 한 도시와 관련이 있습니다. 지역 테이블에서 롤업하여 어떤 도시가 사용자와 관련이 있는지 알고 있습니다.

AREA

  • AREA_ID (PK)
  • CITY-ID (FK CITY.CITY_ID)

퍼팅 CITY_ID 에서 USER_AREAS 테이블은 중복됩니다. 둘째, 배치 CITY_ID 에서 USER_AREAS 테이블은 AREA_ID 그 기록에서 실제로는 관련이 있습니다 CITY_ID 지역 테이블에서. 체크 제한 조건은 열에서 허용되는 값을 제한함으로써 도메인 무결성을 시행하며 다른 테이블에서 열을 참조 할 수 없으면 사용자 정의 된 기능이 적어야합니다.

데이터베이스의 단일 도시에만 속한 사용자 영역의 비즈니스 규칙을 시행 할 수 없습니다. 응용 프로그램 수준에서 수행해야합니다 (Sproc은 무엇이든 삽입/업데이트를 관리합니다. USER_AREAS 테이블).

나는 당신이 "영역"이 무엇을 의미하는지 잘 모르겠습니다.

나는 도시 부문이 다음과 같다고 생각합니다.

지구에는 나라가 있습니다. 국가에는 지역 (주, 지방 등)이 지역 (도시, 마을, 마을 등)이있는 지역 (충분히 큰 경우)이 지구를 가질 수 있습니다.

user => 국가 + 지역/지역 + 도시 ( + 지구)

지역에 대해 자세히 설명해 주시겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top