2011-02-24 4 views
0

뉴스 레터 구성 요소가 있으며 사용자는 여러 뉴스 레터를 구독 할 수 있습니다.데이터베이스에 여러 ID 저장 및 선택

"SELECT * FROM #__newsl_subscribers WHERE newslids LIKE '%" . (int) $id."%'"; 
: 내가 사용하는 뉴스 레터의 가입자를 선택하려면

(이러한 가입자가 가입 한 뉴스 레터의 id의 수 있습니다) 4,8,11 :이 같은 가입자의 테이블에 저장됩니다

ID가 1 인 뉴스 레터를받는 모든 사용자를 선택하려면 뉴스 레터 11 (또는 12, 10 등 ..)을받는 사용자도 선택됩니다. 그리고 그것이 문제입니다.

선택 진술이 존재합니까? 그렇지 않으면 나는 [1], [11] 등의 괄호로 ID를 저장해야합니다.

+0

왜, 왜, 왜, 왜 사람들은 데이터베이스를 정상화하지 않습니까? –

답변

5

하나의 필드에 여러 개의 ID가 저장되는 솔루션은 실제로는 피해야합니다. 대신 n : m 관계, 관계 테이블의 경우처럼 외부 키를 사용해야합니다. n : m- 관계는 다음과 같습니다. 은 복수 b을 가질 수 있으며 그 반대의 경우도 마찬가지입니다.

표 "가입자":

나는 다음을 수행하지 않을 것이다 뉴스 레터에 대한 정보를

표 "뉴스 레터"

새로운 테이블 "newsletter_subscriber"가입자에 대한 정보를 :
필드 : subscriber_id
필드 : newsletter_id
두 필드는 모두 외부 키 (다른 테이블의 기본 키에 대한 참조)입니다. BTW 내가해야

SELECT n.* FROM newsletter n 
INNER JOIN newsletter_subscriber ns ON ns.newsletter_id = n.id 
WHERE ns.subscriber_id = <subscriber id> 

:

SELECT s.* FROM subscriber s 
INNER JOIN newsletter_subscriber ns ON ns.subscriber_id = s.id 
WHERE ns.newsletter_id = <newsletter id> 

그리고 그 반대는, 특정 가입자의 모든 뉴스 레터를 선택 :

특정 뉴스 레터의 모든 가입자를 선택하려면이 문을 사용할 수 있습니다 원래의 질문에 답하지 않은 것을 사과하십시오. 어쩌면 당신은 하나의 필드에 저장된 이러한 ID에 대한 다른 이유가있는 데이터베이스 정규화에 대한 모든 것을 알고있을 것입니다.

+0

감사합니다! 즉 관계에 대한 별도의 테이블을 만드는 것입니다. – Bert

+0

@Bert - 그렇긴하지만 장기적으로 볼 때 훨씬 단순해질 것입니다. –

+0

예, 모든 n : m 사례에 해당합니다. 이렇게하면 두 테이블 간의 관계를 삽입, 업데이트 및 삭제할 때 유연성과 안정성이 향상됩니다. – Zeemee

관련 문제