2012-04-30 3 views
0

을 감안할 때 이러한 비즈니스 규칙 :집행의 일관성 : m 관계

  • 사용자 0 이상의 계정을 가지고 모든 계정은 단일 사용자와 연관된
  • 사용자 0 개 이상의 자산을 보유하고있는 모든 자산은 단일 사용자와 연결
  • 자산이 단일 계정과 연결될 수 있습니다. 계정에 할당 된 계정은 저작물과 연결된 사용자에게 속해야합니다.

    User 
    -id 
    
    Account 
    -id 
    -user_id 
    
    Asset 
    -id 
    -user_id 
    -account_id (Nullable) 
    

    자산이 그 자산이 아닌 다른 사용자에 속한 계정에 할당 될 수 있기 때문에이 스키마에 약점이 나타납니다 :

는 다음과 같은 제안 된 스키마를 가정합니다. 이것은 스키마가 더 좋은 스키마로 이어지는 정상적인 형식 중 하나로 처리됩니까? 정규화를 통해 다루지 않는 경우 비즈니스 로직 측면에서 가장 좋은 제약이 있습니까?

+0

"모든 계정이 단일 사용자와 연결되어 있습니다"- 두 명의 사용자가 동일한 계정 ID 번호를 가질 수 없다는 의미입니까? (자산에 대해 동일한 질문입니다.) –

답변

1

Null 허용 열입니다 다룰 수있는이 (아래)이 정상화의 유일한 부분. Chris Date의 이해에서 열이 NULL을 허용하면 관계는 1NF가 아닙니다.

엄격하게 관계형 모델을 따라 가려고한다면, 당신은 이것을 주장으로 처리 할 수있을 것이라고 생각합니다. 그러나 대부분의 SQL 플랫폼은 어설 션을 지원하지 않습니다. SQL에서는이 라인을 따라 뭔가를 찾고 있다고 생각합니다. 나는 이것을 PostgreSQL에서 테스트했다.

create table users (
    user_id integer primary key 
); 

create table accounts (
    user_id integer not null references users (user_id), 
    account_id integer not null unique, 
    primary key (user_id, account_id) 
); 

create table assets (
    user_id integer not null references users (user_id), 
    asset_id integer not null unique, 
    account_id integer null, 
    primary key (user_id, asset_id), 
    foreign key (user_id, account_id) references accounts (user_id, account_id) 
); 

-- Insert 3 users. 
insert into users values (1), (2), (3); 

-- User 1 has two accounts, user 2 has 3 accounts, user 3 has none. 
insert into accounts values 
(1, 100), 
(1, 101), 
(2, 102), 
(2, 103), 
(2, 104); 

-- User 1 has 1 asset not assocated with an account. 
insert into assets values (1, 200, null); 

-- User 1 has 1 asset associated with account 101 
insert into assets values (1, 201, 101); 

-- User 1 tries to associate an asset with account 102, which doesn't belong to user 1. 
insert into assets values (1, 202, 102); 
[Fails with foreign key violation] 

-- User 2 has two assets not associated with an account. 
insert into assets values 
(2, 500, null), 
(2, 501, null); 
-1

account_id 외래 키를 Asset 테이블에서 완전히 삭제하는 것이 좋습니다. account_id는 사용자 테이블과 관련이 있으므로 자산과 사용자를 결합한 다음 사용자별로 계정에 왼쪽 결합을 수행 할 수 있습니다 (account_id가 기본 키인 테이블 인 경우). 왼쪽 조인에서 결과를 얻으면 자산이 계정에 연결되고 사용자는 동일합니다. 이런 식으로 당신은 그 제약 조건을 강요합니다. 이 도움이

희망, 감사

엘체

+0

자산이 하나 또는 그 이상의 계정에 할당된다는 점에서 여전히 제 3의 비즈니스 요구 사항을 만족하는지 확신 할 수 없습니다. Asset에서 account_id를 제거하면 명시 적으로 계정에 할당 할 자산이 없습니다. 자산 및 사용자에 대한 조인은 모든 자산 및 해당 사용자 세트를 생성합니다. Account (user_id를 통해)에 대한 추가 조인은 하나의 자산을 하나의 계정이나 아무 것도 아닌 계정으로 포착하지는 않을 것이라고 생각합니다. 예를 들어 특정 사용자의 모든 자산은 해당 사용자의 모든 계정에 '속합니다'. – user1338952

+0

당신은 당연히 맞습니다. 나는 그 사실을 잊어 버렸습니다. 사용자와 계정 및 자산을 연결하는 테이블을 만드는 방법은 어떻습니까? account_asset accountid assetid 그렇게 할 수 없다면 비즈니스 논리에 이러한 관계를 적용해야합니다. –