2010-05-26 4 views
2

나는 다음 표 ... 사람이 같은 사용자 이름/암호하지만 서로 다른 AccountTypes을 가질 수 있도록 내가 ID와 ACCOUNTTYPE 열에서 복합 키를 생성 한외래 키와 복합 키?

TABLE: Accounts 
    ID (int, PK, Identity) 
    AccountType (int, PK) 
    Username (varchar) 
    Password (varchar) 

있습니다.

이것은 제가 시도하고 연결하려는 각 외부 테이블에 대해 두 개의 열을 만들어야한다는 것을 의미합니까?

나는 이것이 내가하려고 링크 각 외부 테이블은 두 열을 만들어야합니다 뜻 SQL 서버 2008

+2

인가 ID 뭔가? 그렇다면이 경우 기본 키로 자동 생성 정수를 사용하는 것이 좋습니다. – Syntactic

답변

8

을 사용하고 있습니다?

예.

그러나 별도의 테이블을 사용하여 사용자 이름/비밀번호를 저장하고이 테이블을 user_accounts (복합 기본 키 포함)에 연결하는 것이 좋습니다.

사람들이 동일한 사용자 이름/암호를 가질 수 있지만 다른 AccountType을 가질 수 있도록 ID와 AccountType 열의 복합 키를 만들었습니다.

id은 같으나 다른 사용자는 다른 사용자 이름과 비밀번호를 가질 수 있습니다. 여기

당신이 그것을해야하는 방법은 다음과 같습니다

CREATE TABLE t_user (id INT NOT NULL IDENTITY PRIMARY KEY, Username VARCHAR(100) NOT NULL, YouShouldAlwaysUseSaltedAndHashedPasswords VARCHAR(64) NOT NULL) 

CREATE TABLE t_user_account (user_id INT NOT NULL, account_id INT NOT NULL, PRIMARY KEY (user_id, account_id), FOREIGN KEY (user_id) REFERENCES t_user (user_id)) 
+1

답변 해 주셔서 감사합니다.나는 나의 질문이 다른 무엇보다 설계 문제에 더 가깝고 당신의 대답이 내가 갖고있는 문제를 분명히 해 주었다고 생각한다. – paulio

+0

참조 된 열은 키가 만들어진 순서와 같아야합니다. 올바른 순서를 얻으려면 외래 키 (SSMS에서 테이블을 확장 할 때 키 폴더 아래)를 마우스 오른쪽 단추로 클릭하고 클립 보드로 만들기 스크립트를 작성하십시오. 풀. 참조 된 열이 키와 동일한 순서인지 확인하십시오. – Trevor

1

예. 이를 피하기 위해 ID를 int 신원 확인 정보로 만들고 기본 키만 작성한 다음 Username/AccountType에 새로운 고유 색인을 추가합니다. 사람이 같은 사용자 이름/암호하지만 서로 다른 AccountTypes을 가질 수 있도록

4

나는 ID 및 ACCOUNTTYPE 열에서 복합 키를 만들었습니다.

필요하지 않습니다!

  • 혼자 ID 컬럼에 PK를 넣어 (그것은 IDENTITY입니다 - 그래서 항상 독특한)와

  • (UserName, AccountType)에 UNIQUE 제약 조건을 넣어 (또는 인덱스) 자식 테이블에서 참조로 그 사용 - 그 방법은 동일한 유형

내 의견으로는, 당신의 PK에서 AccountType를 가진 아무 소용이 없잖아요 두 개의 계정을 가지고에서 사용자를 방지 할 수 있습니다.

대신 사용이 디자인 : 현실 세계에서 의미가

TABLE: Accounts 
    ID     INT IDENTITY  PRIMARY KEY 
    AccountType  INT   UNIQUE CONSTRAINT(Username, AccountType) 
    Username   VARCHAR  UNIQUE CONSTRAINT(Username, AccountType) 
    Password   VARCHAR 
+0

이렇게하면 동일한 사용자 이름을 가진 사람들이 다른 계정 유형에 대해 다른 암호를 가질 수 있습니다. @op가 원하는 것이 무엇인지 확신 할 수 없습니다. – Quassnoi

+0

좋은 대답이지만 Quassnoi가 말한 것. – paulio

+0

@ Quassnoi, @ paulio : 서로 다른 계정 유형에 대해 서로 다른 비밀번호를 사용하는 것이 좋지 않을 수도 있습니다. "일반"사용자로 "opensesame"을 사용하고, "admin"으로는 더 강한 것을 사용합니다. ..... –