2010-07-21 4 views
1

나는,이 테이블은 그러나 이것이를 창조하고, 코드가 다음 가지고가는 경우에 기본적인 아이디어는 자사의 회원 ID 필드에 채워되는이중복 열

 
codes 
id | code | member_id 
1 | 123 | 2 
2 | 234 | 1 
3 | 345 | 
4 | 456 | 3 

members 
id | code_id | other info 
1 | 2  | blabla 
2 | 1  | blabla 
3 | 4  | blabla 

같은 두 개의 테이블이있는 데이터베이스를 찾아 보게한다 원 링크 (멤버가 코드를 가리키고 코드 포인트가 멤버를 가리킴)가이 작업을 수행하는 다른 방법이 있습니까? 이게 실제로 나쁜 것입니까?


업데이트
없어, MEMBER_ID 열이 코드가 청구되지 것입니다 후 비어있는 경우 약 350 만 코드를 각 각 테이블은 서로 다른 기준에 따라 검색하는 세 가지 다른 코드 테이블, 거기에 당신의 질문에 대답하려면 이 코드는 데이터베이스가 검색 될 때 다른 테이블을 포함 할 필요가 없다는 것을 알려주는 코드입니다.

회원 테이블에는 모든 단일 코드에 대한 청구자가 포함되어 있으므로 1,050 만 명의 회원 추가 정보에는 mobile, flybuys와 같은 것이 있습니다.

모바일은 회원을 식별하는 방법이지만 각 항목은 다른 회원으로 간주됩니다.

+0

왜 회원 테이블에 code_id가 필요합니까? –

+2

더 많은 정보가 필요합니다.이 두 엔티티에 대한 모든 비즈니스 규칙은 무엇입니까? 의미, 어떻게 서로에게 관련되어 있는지, 각 테이블의 데이터를 알아야하는지. –

답변

3

변칙으로 끝날 수 있기 때문에 나쁜 것입니다. 예 :

codes 
id | code | member_id 
1 | 123 | 2 

members 
id | code_id | other info 
2 | 4  | blabla 

이상한 부분을 참조하십시오. 코드 1은 해당 구성원을 참조하지만 해당 구성원은 동일한 코드를 참조하지 않습니다. 이례적인 문제는 어떤 것이 올바른 의도 된 참조인지, 어떤 것이 실수인지를 알 수 없다는 것입니다.

중복 열을 제거하면 예외가 발생할 가능성이 줄어 듭니다. 이것은 rules of normalization이라는 매우 잘 정의 된 몇 가지 규칙을 따르는 간단한 프로세스입니다.

예를 들어 codes.member_id 열을 삭제합니다. 회원이 코드를 참조해야한다고 추측하지만 코드가 반드시 회원을 참조하지는 않습니다. 그래서 members.code_id 참조 codes.id을 만들 것입니다. 그러나 그것은 다른 방향으로 갈 수 있습니다. 독자는 확신할만한 정보를주지 못한다 (@OMG Ponies가 언급했듯이).

0

단순히 member_id 열을 삭제하고 외래 키 관계 (또는 부재)를 사용하여 관계 또는 부족을 나타낼 수 있습니다. 그런 다음 code_id 열은 코드에 대한 외래 키로 사용됩니다. 개인적으로, DB에서 손상된 관계가 없는지 확인하기 위해 더 많은 작업을 수행하기 때문에 간단하다고 생각합니다. 즉, 두 열이 테이블간에 동기화되었는지 확인해야합니다. 일반적인 경우에는 아무 것도 추가하지 않습니다. 성능 문제가있는 경우 비정규 화해야 할 수도 있지만 문제가 될 때까지 기다릴 수 있습니다.이 경우 ID 이상을 복제 할 수 있습니다.

1

데이터 무결성 문제가 발생할 수 있으므로 좋지 않습니다. 일대일 관계가 있으므로 멤버 테이블에서 Code_id를 제거하거나 코드 테이블에서 member_id를 제거하십시오. (이 경우 회원들로부터 code_id를 삭제하는 것이 더 합리적인 것처럼 보일 것입니다. 왜냐하면 어떤 코드가 없는지를보기 위해 멤버를 쿼리하는 것보다 할당 된 것이 아닌 코드를 쿼리하는 것이 더 자주 발생하는 것처럼 들리지만 전화 걸기)

0

당신이하는 일에 따라 다릅니다. 각 멤버가 항상 정확히 하나의 고유 코드를 가져 오면 실제 코드를 멤버 테이블에 넣으면됩니다.

코드 집합이 있고 여러 구성원이 코드를 공유하지만 각 구성원은 여전히 ​​코드를 공유하는 경우 코드 테이블에서 member_id를 제거하고 고유 코드 만 저장하십시오. 멤버를 통해 특정 코드에 액세스하십시오. (코드 검색을 위해 코드 테이블에 계속 참여할 수 있음)

구성원이 여러 코드를 가질 수있는 경우 구성원 테이블에서 code_id를 제거하고 코드 테이블의 member_id는 구성원을 코드와 관련시키는 세 번째 테이블을 생성 할 수 있습니다. 멤버 테이블의 각 레코드는 고유 한 레코드 여야하며 코드 테이블의 각 레코드는 고유 한 레코드 여야합니다.

0

코드 테이블에 멤버 코드가있는 이유는 무엇입니까?

두 정보가 모두 필요한 경우 언제든지 참여할 수 있으므로 불필요합니다.

업데이트가있을 때마다 두 테이블을 모두 업데이트해야하므로 무결성 문제가 발생할 수 있습니다.

0

예. 좋지 않습니다. 도움을 줄 수있는 순환 참조를 갖도록 데이터베이스를 설정하지 마십시오. 이제 모든 변경 작업을 두 곳에서 수행해야하며 한 곳을 놓친 경우 심각한 데이터 무결성 문제가 발생합니다.

첫 번째 질문은 각 코드가 둘 이상의 회원에게 할당 될 수 있습니까? 또는 각 구성원이 둘 이상의 코드를 가질 수 있습니까? (이것은 누가 어떤 코드를 가졌는지에 대한 기록을 필요로하는 경우 시간이 지남에 따라 어느 순간에도 포함됩니다.) 어느 하나에 대한 대답이 '예'이면 현재 구조가 작동하지 않습니다. 두 가지 모두에 대한 대답이 '아니오'인 경우 두 테이블이 필요한 이유는 무엇입니까?

다중 코드와 여러 구성원을 가질 수있는 경우 멤버 ID와 코드 ID가있는 브리지 테이블이 필요합니다. 여러 멤버에게 하나의 코드를 할당 할 수있는 경우 코드 ID를 멤버 테이블에 넣습니다. 다른 f 식이면 코드 테이블의 구성원이어야합니다. 그런 다음 외래 키 관계를 올바르게 설정하십시오.

+0

"두 가지 모두에 대한 대답이 '아니오'인 경우 왜 두 개의 테이블이 필요합니까? - 그의 유스 케이스에는 코드가없는 멤버와 멤버가없는 코드가 있으므로 두 테이블을 갖는 것이 유효합니다. – heisenberg

0

@Bill Karwin은이를 올바르게 비정상으로 이어질 수있는 디자인 결함으로 식별합니다.

code 가정 및 member가 별개의 실체는, 나는 thrid 테이블을 만들 것입니다 ...

codemember 사이의 관계는 무엇이라고

? oath? 이것이 실제 생활 관계라면, 사업 분야의 지식을 가진 사람은 그 이름을 부여 할 수 있습니다. 하지 않으면 것은 더 이상의 설계 결함을 찾습니다

oaths 
code_id | member_id 
1  | 2 
2  | 1 
4  | 3 

데이터는 고유 제한 조건 (code_id, member_id) 필요하다는 것을 시사한다.

데이터가 '스크러빙 된'후에는 codes.member_idmembers.code_id 열을 버리십시오.

관련 문제