2010-04-22 3 views
1

one => oneone => many 관계를 지원하는 기본 orm을 만들기 위해 해킹하고있었습니다. 나는 다소 성공했다고 생각하지만 순환 관계를 다루는 방법에 대해 궁금합니다. 나는 당신이하고 싶은 이유를 잘 모르겠습니다 지금ORM은 일반적으로 순환 관계를 허용합니까? 그렇다면 어떻게 처리할까요?

$u = new user(); 
echo $u->car->wheels[0]->car->wheels[1]->car->wheels[2]->car->wheels[3]->type; 
    #=> "monster truck" 

:

user::hasOne('car'); 
car::hasMany('wheels'); 
car::property('type'); 
wheel::hasOne('car'); 

그런 다음이 (이론적으로) 할 수있는 :

는이 같은했다 말해봐. 훨씬 짧은 시간에 끝낼 수있는 무언가를 얻으려면 기억과 시간의 낭비가 낭비되는 것 같습니다. 내 작은 ORM에서는 wheel 클래스의 복사본 4 개와 메모리에있는 car 클래스의 복사본 4 개가 있습니다. 그 중 하나를 업데이트하고 데이터베이스에 다시 저장하면 문제가됩니다. 나머지는 오래된 것입니다. 이미 만들어진 변경 사항을 덮어 쓸 수 있습니다.

다른 ORM은 순환 참조를 어떻게 처리합니까? 그들은 심지어 그것을 허용합니까? 그들은 나무 위로 올라가서 부모 중 한 명에게 포인터를 만드나요? 서클에서 돌아 다니기에 바보 인 경우 코더가 발에서 자신을 쏠 수 있습니까?

답변

1

순환 참조는 ORM에서 문제가되지 않습니다. ORMS는 평가에 게으르다. 즉, 레코드에 액세스 할 때까지 레코드를 검색하지 않는다. 이런 식으로 무한 루프 문제는 없습니다. 당신이 글을 쓸 때 게으른 사람이라면 문제는 사라집니다.

+0

그래서 기본적으로 3 개의 자동차 오브젝트를로드하고 하나를 변경하고 저장하는 것과 동일한 작업을 수행합니까? – SeanJA

1

대부분의 ORM은 메모리에 단일 고유 개체를 적용합니다. 따라서 자동차에 처음 액세스하면 자동차가 메모리에로드되고 고유 키로 식별 할 수 있습니다. 휠을 타고 차로 돌아간 후 ORM은 이미 메모리에있는 차를 가지고 있기 때문에 다시로드하지 않습니다. 이 접근법은 단점이있는 것은 아니지만 각 ORM은 다양한 단점을 해결하기 위해 다양한 방법으로 작동합니다.

+0

의심스럽게 전역 변수와 같은 소리가납니다 ...? – SeanJA

+0

@SeanJA : 아니요, 메모리에있는 객체를 보유하고있는 "세션"은 수명이 긴 객체가 아닙니다. 웹 응용 프로그램에서 일반적으로 웹 요청 당 세션이 있습니다. "세션"의 수명은 프로그래머를 완전히 제어합니다. –

관련 문제