CI 묻고 답하기

제목 [질문] 모델에 HABTM 관계를 설정할 수 는 없나요?
글쓴이 kirrie 작성시각 2009/05/20 17:44:01
댓글 : 1 추천 : 0 스크랩 : 0 조회수 : 29509   RSS
마냐님을 위해서 간단하게 설명드리려다보니 글이 길어질 것 같아서 답글로 대신합니다.

--->

HABTM은 (아마도 기억에) 레일스에서 처음 나온 것인데, 테이블을 하나의 객체로 보고 각 객체 사이에 관계를 규정하는 방식 가운데 하나입니다. low level에서 보자면, 일종의 join 같은거지요.

has_one, has_many, belong_to, has_and_belong_to_(many) 등의 관계가 있습니다.

1. has_one
말 그대로 A가 B를 하나 가지고 있는 형태를 의미합니다. 예를 들어 사용자 기본 정보 테이블(A, 아이디 비밀번호 등등을 가지고 있음.)이 있고 각 사용자의 디테일 정보를 갖는 테이블(B, 집주소 전화번호 취미 등등을 가지고 있음)이 있다고 할 때
A는 B와 1:1관계이면서 (하나의 사용자는 반드시 하나의 사용자 디테일 레코드만 갖습니다.), A의 레코드 하나가 B의 레코드 하나를 갖는 형태로 표현될 수 있습니다. 이럴때 has_one을 사용합니다.

2. belong_to
has_one이 A의 입장에서 1:1 관계의 형태를 표현한다고 하면 belong_to는 B의 입장에서 관계의 형태를 표현합니다.
즉, 하나의 사용자 디테일 레코드는 반드시 하나의 사용자 기본 레코드에 '속해' 있습니다.

3. has_many
has_many는 하나의 레코드가 여러개의 다른 관계 레코드를 갖는 경우를 표현합니다.
쉽게 설명하자면, 하나의 게시글은 여러개의 코멘트를 가질 수 있습니다. 이런 관계가 대부분이죠.

4. has_and_belong_to_(many)
좀 복잡하지만 매우 중요한 관계입니다. 이건 A와 B가 서로를 여러개 가질 수 있는 관계를 의미합니다.
게시물과 태그의 관계가 가장 대표적인 예입니다.
즉, 어떤 하나의 게시물은 여러개의 태그를 가질(지정 할) 수 있습니다. 동시에 하나의 태그 또한 여러개의 게시물을 가질 수 있습니다.
이 경우에는 보통 테이블이 3개가 필요합니다. 게시물 테이블, 태그 테이블, 게시물과 태그를 관계짓는 메타 테이블..

물론 위의 모든 관계는 그냥 조인(join) 쿼리로 작성이 가능합니다만, 테이블과 레코드들을 객체로 보고 이들의 관계를 명백하게 규정하는 클리어한 구문들로 표현함으로써
코딩의 일관성이라던가 가독성을 높이는 일을 합니다. (실제로 이런 동작을 구현하는 라이브러리들을 뜯어 보면 위의 관계들을 조인 쿼리로 변환해주는 것을 확인할 수 있습니다.)

ORM(혹은 datamapper)이란 http://www.javajigi.net/pages/viewpage.action?pageId=6560 여길 보시면 기본 개념을 잡으실 수 있습니다.
간단히 말해서 데이터를(모델) 객체지향적인 관점에서 해석하여 사용하는 방식을 총칭합니다.
모든 데이터(모델)들은 하나의 명시적인 객체로 표현이 가능해야 하며, 이들의 관계 또한 객체로 표현이 가능해야 합니다.
innis님께서 링크를 걸어주신 것처럼 CI에도 datamapper 라이브러리가 있습니다.
 다음글 가이드에 있는 Model 예제 에러가 나서 그러는데요.... (2)
 이전글 codeigniter 요청 처리절차 (1)

댓글

kirrie / 2009/05/26 17:38:12 / 추천 0
마냐//말씀하신 것은 데이터베이스 레벨에서 다루는 것이고, 이것은 어플리케이션 레벨에서 다루는 내용입니다.