[mysql] 다대다 관계에 대한 고찰 1
실무상에서 DB 구성시 꼭 알아두어야 할 내용이 다대다 관계의 DB 구성내용이다.
Mysql 뿐만 아니라 다른 관계형 데이터베이스에서 공통으로 적용되는 아주 중요한 내용이다. ~
예를 들어 강사와 과목의 DB 를 구성한다고 하면, 이러한 다(多)대다(多) 관계의 좋은 예라 하겠다.
홍길동 강사가 수학, 국어를 가르칠수도 있고, 또한 국어를 가르치는 강사가 홍길동 뿐만 아니라 강감찬, 이순신도 있을 수 있다.
상하 관계가 있는 1대다 관계와 다른 상황이다.
이를 DB로 깔끔하게 구성하는 방법은 1:다:1 로 DB 를 재구성하는 것이다.
이렇게 1:다:1 관계로 DB 를 구성하게 되면, 홍길동 1명에 중간 다 테이블에 성적,시험일자 등의 칼럼을 구성할 수 있으며, 수학 1개로 만들 수 있다.
다음 아래는 나름대로 간단하게나마, Mysql 과 PHP 소스 형태로 한번 틀만 구성해 보았다.
[강사 테이블]
[과목 테이블]
[강사 와 과목의 1:다:1 테이블]
내부 조인 Inner join 형태로 lecturer (강사) 와 lecturer_cate_in (강사와 과목의 1:다:1 테이블) 결합하여,
해당 이종원 강사의 과목을 연결해 주고 있다.
그리고, mysql 과 PHP 형태로, 해당 강사 목록 페이지를 구성할때 과목 검색 기능을 연동하고자 할때,
아래와 같이 소스를 구성할 수 있겠다.
위의 그림예에서, 방과후지도사 (lcate_no 가 2번) 를 클릭하여 검색하면 해당 강사 목록을 불러오는 쿼리는 아래와 같다.
select A.lno,A.name,A.hp,A.lec_pic1 from lecturer A , (select lcate_no,lno from lecturer_cate_in B where lcate_no=2) B where A.lno=B.lno
마지막으로 PHP 형태로 간략히 종합적인 강사목록 소스를 간추려보았다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
<?
$page = ($_GET[page])? $_GET[page] : $_POST[page];
$sname = ($_GET[sname])? $_GET[sname] : $_POST[sname];
$ssubject2 = ($_GET[ssubject2])? $_GET[ssubject2] : $_POST[ssubject2];
$show_page = 20;
$block_page = 10;
$keyGap = " where A.useyo='y' ";
if ($sname || $ssubject2) {
if ($sname) {
$keyGap .= " and A.name like '%".$sname."%'";
}
if ($ssubject2) {
$keyGap = " , (select lcate_no,lno from lecturer_cate_in B where lcate_no=".$ssubject2.") B " . $keyGap. " and A.lno=B.lno";
}
}
//$tQ = "select count(*) from lecturer A , (select lcate_no from lecturer_cate_in B where lcate_no=2) B ";
$tQ = "select count(*) from lecturer A $keyGap";
$tresult = mysql_query($tQ) or die("강사 카운트 정보 얻기 실패");
$trow = mysql_fetch_row($tresult);
$total = $trow[0];
if(!$page) $page = 1;
$start = ($page-1)*$show_page;
$total_page = (int)(($total-1)/$show_page)+1;
// select A.lno,A.name,A.hp,A.lec_pic1 from lecturer A , (select lcate_no from lecturer_cate_in B where lcate_no=2) B
// select A.lno,A.name,A.hp,A.lec_pic1,B.lcate_no,B.cate_name from lecturer A , (select lcate_no,cate_name from lecturer_cate_in B where lcate_no=2) B
$query = "select A.lno,A.name,A.hp,A.lec_pic1 from lecturer A $keyGap order by A.lno DESC limit $start,$show_page";
$result = mysql_query($query) or die("강사 정보 얻기 실패");
?>
|
cs |