2. 사용되는 메타 인포메이션
***
좀있다 언급될 거의 모든것은 예제로 설명된다. 이 예제는 backsql/rdbms_depend 디렉토리에 위치하고 있고,
Oracle,MSSQL,MySQL을 위한 샘플 데이타 베이스를 생성하기위한 스크립트를 포함하고 있다.
***
우선 제일 먼저 필요한 것은 여러분의 RDBMS정보를 표현할수 있는 LDAP objectclass들이 무엇이 있을까하는
것이다. (어떤 LDAP objectclass들이 RDBMS정보를 표현할수 있을까?)
가장 간단한 방법은 relational 스키마를 디자인할때, ER다이어그램에서 각각의 Entity에 대한 objectclass를
생성하는 것이다. 어떠한 관계형 스키마도 ,그것이 얼마나 normalize되어 있든, 여러분의 어플리케이션 도메인에 대한
모델링을 거쳐서 디자인 된다. 그리고 이것은 단지 normalized스키마의 테이블이 아니라 entity라는 용어로 사용된다.
이 말의 의미는 모든 instance에 대한 모든 attribute에 대해서 그 값을 로딩하는 효과적인 SQL쿼리가 존재한다는
뜻이된다.
또한 inetOrgPerson과 같은 표준 스키마들을 따르는 objectclass들을 원할지도 모르겠다.
그럼에도 불구하고, 역시나 우리는 LDAP operation을 일련의 SQL쿼리로 바꾸기위한 방법을 정의해 주어야만 한다.
SEARCH 에 대해서 생각해보면...
Example: 우리가 우리 조직(organization)내에서 일하는 사람들(persons) 에대해서 정보를 저장하고 있다고 가정하자.
<pre>
PERSONS
----------
id integer
first_name varchar
last_name varchar
middle_name varchar
PHONES
----------
id integer
pers_id integer references persons(id)
phone
...
</pre>
(PHONES 테이블은 persons와 관련한 telephone number를 가지고 있다.) person은 여러개의 number를 가질수가 있고, 그래서
PHONES는 일치하는 pers_id에 대해서 몇개의 레코드를 가지거나 또는 아예 가지지 않는다. (위에서 보시면 알수 있듯이
pers_id가 PHONES테이블의 foreign key로 설정이 되어 있는것을 풀어서 말한 것입니다. 그러므로 LDAP와 같이 phone 항목에
0개또는 여러개의 value를 가질수가 있게 됩니다. ) 이러한 정보를 표현하기 위한 LDAP objectclass는 다음과 같다.
person
-------
MUST cn
MAY telephoneNumber
MAY firstName
MAY lastName
...
(위에 보시는 것은 역시나 openldap 버전2대의 스키마 표현형식입니다.)
만일 주어진 person ID로 모든 값의 cn attribute를 가져올려고 하면, 다음과 같은 쿼리를 날리면 된다.
SELECT CONCAT(persons.first_name,' ',persons.last_name) as cn FROM persons WHERE persons.id=?
telephoneNumber에 대해서는 :
SELECT phones.phone as telephoneNumber FROM persons,phones WHERE persons.id=phones.pers_id and persons.id=?
만약에 (telephoneNumber=123*)같은 검색 필터로 LDAP서비스를 하고 싶다면 다음과 같이 한다.:
SELECT ... FROM persons,phones WHERE persons.id=phones.pers_id and persons.id=? and phones.phone like '123%'
그러므로, 만일 우리가 어떤 테이블이 각 attribute에 대한 값을 가졌고,어떻게 이 테이블들을 join하고 이러한 값을
정렬하면되는 지에 대한 정보를 가지고 있다면, 우리는 이러한 sql statement를 자동으로 생성할수 있고, 그러한
search filter에 대해서 SQL WHERE 문으로 바꿀수 있게 할수가 있다.
|