문제

나는에 대해 더 자세한 내용을 객체 지향 프로그래밍,그 시작을 구현하는 다양한 디자인 패턴,에게 돌아오는 경우가 사람은 미워하기에 Active 기록.

자주 사람들은 말하지 않는 확장성(인용 트위터로 예)-그러나 아무도 실제로는 설명 그것은 확장성이 떨어지고;그리고/또는 달성하는 방법의 장점 AR 없이 단점(을 통해 비슷하지만 다른 패턴?)

희망이 없으로 설정 거룩한 전쟁에 대한 디자인 패턴-모두 알고 싶은****특별****무엇이 잘못으로 활동 기록합니다.

지 않을 경우 확장,왜?

다른 어떤 문제이 있습니까?

도움이 되었습니까?

해결책

ActiveRecord 디자인 패턴ActiveRecord 레일 ORM 라이브러리, 고 있는 톤의 노크-오프습니다.순,그리고 다른 언어가 있습니다.

이들은 모든 것이 다릅니다.그들은 대부분을 따르는 디자인 패턴 있지만,확장 및 수정에서 그것은 많은 다른 방법으로,그래서 전에 사람이 말한"ActiveRecord Sucks"그것을 요구하는 자격에 의해 말하는"ActiveRecord,거기에 힙?"

나만을 잘 알고 레일'ActiveRecord,I'll try 주소를 모두 불만이 제기되었에서의 컨텍스트를 사용하여니다.

@연기하는거야

문제는 나와 함께 볼 Active 기록은,그것은 항상 그에 대해 하나의 테이블

코드:

class Person
    belongs_to :company
end
people = Person.find(:all, :include => :company )

이를 생성 SQL LEFT JOIN companies on companies.id = person.company_id, 고 자동으로 생성한 관련 회사는 개체를 할 수 있도록 people.first.company 고 그것은 필요가 없을 칠 때문에 데이터베이스의 데이터 이미 존재한다.

@pix0r

고유의 문제가 활성코드가는 데이터베이스 쿼리가 자동으로 생성되고 실행되는 채체고 수정하는 데이터베이스 기록

코드:

person = Person.find_by_sql("giant complicated sql query")

이것은 권장하지 않으로것은,하지만 경우에 당신은 그냥 평범하고 단순히 작성해야 원 SQL,그것은 쉽게 할 수 있습니다.

@팀 Sullivan

...그리고 당신은 선택의 여러 인스턴스 모델은,당신은 기본적으로 하고"select*from..."

코드:

people = Person.find(:all, :select=>'name, id')

이 이름을 선택하고 ID 열 데이터베이스에서,모든 다른'속성에 매핑된 개체는 것이 전무하지 않는 한,당신 수동으로 다시 해당 개체니다.

다른 팁

다는 것을 발견했 ActiveRecord 가에 대한 CRUD 기반 응용 프로그램 모델을 비교적 평평(마찬가지로 많은 클래스 계층).그러나 응용 프로그램에 대한 복잡한 OO 계층 구조,a 유사 여 아마도 더 나은 솔루션입니다.동 ActiveRecord 정 1:1 비율 사이에는 테이블과 데이터를 객체의 종류는 관계를 가져오기 힘들어집 더 복잡한 도메인입니다.그 책 패턴, Martin Fowler 는 ActiveRecord 나누어 경향이 있는 조건 하에서는 귀하의 모델은 매우 복잡하며,제안 유사 여 으로 대안입니다.

내가 찾은 이 말이 사실이다.는 경우에,당신이 많은 상속 도메인에서,그것은 어렵지도 상속의 RDBMS 보다 그것은 그 지도를 연결 또는 구성입니다.

내가 하는 것은"도메인"는 개체의 액세스 컨트롤러를 통해 이러한 유사 여(또는"서비스 계층")클래스입니다.이러한을 하지 않도록 하시기 바랍니다 거울을 데이터베이스하지만,행동으로 OO 표현에 대한 몇 가지 있습니다.말이 있는 사용자 등에서 당신의 도메인 및 필요에 대한 참조,또는 컬렉션의 다른 개체에 이미로드를 검색할 때는 사용자 객체입니다.데이터 수 있습에서 나오는 많은 서로 다른 테이블,그리고 ActiveRecord 패턴을 만들 수 있습니 정말 어렵습니다.

을 로드하는 대신 사용자 객체를 직접 액세스하는 데이터를 사용하여 ActiveRecord 스타일 API,컨트롤러 코드를 검색한 사용자 객체를 호출하여 API 의 UserMapper.getUser()메소드에 대한 인스턴스입니다.그것은 매퍼는 책임을 로드하는 관련된 모든 개체들이 각자의 테이블 및 복귀 완료한"사용자 도메인"개체를 발신번호를 입력하실 수 있습니다.

기본적으로,당신은 단지 추가하여 추상화 계층을 만들의 코드 더 많은 관심.여부를 당신의 유사 여 클래스가 포함한 원료 사용자 지정 SQL,또는 데이터의 추상화 계층 API,또는 액세스 ActiveRecord 패턴 자신이 정말 중요하지 않 컨트롤러로 코드를 받는 좋은 인구가 사용자 객체입니다.

어쨌든 그게 내가 그것을 하십시오.

가 있다고 생각 가능성이 매우 다른 설정의 이유 사이 왜 사람들은"싫어하는"에 ActiveRecord 고 무슨은"잘못된"습니다.

에서 싫어하는 문제가 많이 독으로 아무것도 레일로 관련이 있습니다.까지 잘못이 무엇인지,그것을 가능성이 있는 것처럼 모든 기술하고 있는 상황이 좋은 선택이 있는 상황은 더 나은 선택입니다.가 상황을 얻지 않을 활용하는 기능의 대부분의 레일 ActiveRecord,내 경험에는 데이터베이스가 심하게 구성되어 있습니다.당신은에 액세스하지 않고 데이터 기본 키로 일을 위반하는 첫 번째 정상적인 형태로,많이 저장된 절차에 액세스하는 데 필요한 데이터는,당신은 잘 사용하는 무언가가 더욱의 단 SQL 래퍼입니다.는 경우에 데이터베이스는 상대적으로 구조적,ActiveRecord 활용할 수 있습니다.

테마를 추가의에 회신 의견 제시를 말하는 사람 것은 하드에서 ActiveRecord 코드 조각은 답변

@샘 McAfee 말이 있용 클래스에서 당신의 도메인 및 필요에 대한 참조,또는 컬렉션의 다른 개체에 이미로드를 검색할 때는 사용자 객체입니다.데이터 수 있습에서 나오는 많은 서로 다른 테이블,그리고 ActiveRecord 패턴을 만들 수 있습니 정말 어렵습니다.

user = User.find(id, :include => ["posts", "comments"])
first_post = user.posts.first
first_comment = user.comments.first

를 사용하여 포함 옵션을 ActiveRecord 할 수 있습을 재정의 기본값으로드는 동작입니다.

내 길고 늦은 답변,심지어 완료,하지만 좋은 이유는 설명이 패턴,심지어 일부 의견 감정:

1)짧은 버전을 사용:Active 기록 만듭니다"얇은 층"의"강한 바인딩"사 데이터베이스 및 그 응용 프로그램 코드입니다.를 해결하는 없는 논리,아니 어떤 문제,전혀 문제가 없습니다.이럴을 제공하지 않는 모든 값을 제외하고,몇몇 구문 설탕 을 위한 프로그래머(수 있는 그런 다음 사용하"개체 구문을"일부 액세스는 데이터가 존재하에서는 관계형 데이터베이스)입니다.을 만들려고 노력 중 일부 편안함을 위한 프로그래머 한(IMHO...)더 나은 투자에서 낮은 수준의 데이터베이스 도구에 액세스할 수 있습니,예를 들어,어떤 변형의 간단하고,쉽게,일반 hash_map get_record( string id_value, string table_name, string id_column_name="id" ) 및 이와 유사한 방법(물론,개념과 우아함까지 다양하게 찾으로 사용되는 언어).

2)긴 버전:모든 데이터베이스에서 구입하는 프로젝트가"개념적 통제"의 것,내가 피할 AR,그리고 그것은 좋은 일이었습니다.나는 일반적으로 구축 층 건축물 (당신이 조만간렇게 나누어 소프트웨어에서는 레이어에서 적어도 중간 대규모 프로젝트):

A1)데이터베이스 자체,테이블,관계,심지어 일부는 논리는 경우 DBMS 할 수 있(MySQL 은 또한 성금)

A2),자주 이상 데이터 저장소:파일 시스템(blob 에서 데이터베이스는 항상 좋은 결정을...),레거시 시스템(자신을 상상하는 방법""그들은에 액세스할 수 있는 많은 종류가 가능합니다..하지만 그 점...)

B)데이터베이스에 액세스 층(이 수준에서,도구 방법,헬퍼에 쉽게 액세스할 수 있도록 데이터에서 데이터베이스는 매우 환영하지만,AR 을 제공하지 않는 모든 값을 여기를 제외하고,어떤 구문 설탕)

C)응용 프로그램 개체 층:"응용 프로그램 개체"때로는 간단한 행 테이블의 데이터베이스에서,하지만 대부분의 시간을 그들은 화합물 체는 어쨌든,일부 높은 논리에 부착,그래서 시간을 투자하기에 AR 체에서 이 수준은 노골적으로 쓸모없는,폐기물의 소중한 순간 때문에"진짜 가치","더 높은 논리는"그 개체 구현이 필요하의 상단에 AR 체,어쨌든지 않고 AR!고,예를 들어,당신은 왜할 수 있는 추상적 의"로그 항목의 개체"?응용 프로그램 논리 코드를 기록하지만,해야 하는 능력을 가지고 업데이트하거나 삭제합니까?바보 같은 소리,그리고 App::Log("I am a log message") 일부 크기보다 쉽게 사용 le=new LogEntry(); le.time=now(); le.text="I am a log message"; le.Insert();.예를 들어:를 사용하여"로그 항목에서"기록 보기 응용 프로그램에서 작동을 위한 100,1000 또는 10000 로그인이지만,조만간을 최적화하고 내에서 대부분의 경우에,당신이 사용하는 작은 아름다운 SQL SELECT 앱에서 논리(는 완전히 휴식 AR 아이디어..),신을 감싸는 작은 성명에서 엄밀하 고정 AR 아이디어 프레임의 많은 코드를 감싸고 숨어있습니다.시간을 낭비와 함께 작성 및/또는 건축 AR 코드를 수 있었던 투자에서 훨씬 더 많은 영리한 인터페이스를 읽기위한 목록의 로그 항목(많은,여러 가지 방법으로,하늘이 제한).더야 감를 발명하는 새로운 추상화 을 실현하는 그들의 응용 프로그램 논리에 맞게 의도한 응용 프로그램 지 바보 re-구현하는 바보 같은 패턴, 좋은 소리 첫눈에!

D)응용 프로그램 논리를 구현하고 논리의 상호 작용하는 개체를 생성,삭제하고 목록에(!) 의 응용 프로그램 논리를 개체(없는,그 작업을 거에 고정되어야에 응용 프로그램 논리를 개체 자체:는 종이 당신의 책상에게 당신의 이름과 위치를 모두 다른 장에서 당신의 사무실은?잊지"정적인"방법을위한 목록의 개체,그게 바보 같은,나쁜 타협할 수 있도록 만들어진 인간의 사고 방식에 맞는[어떤지 모든-AR-프레임워크아]AR 생각)

E)사용자 인터페이스-잘 되면 내가 무엇을 할 것이라 쓰기에 다음과 같은 라인은 매우,매우,매우 주관적이지만,제 경험 프로젝트에 내장되어 AR 종종 무시된 UI 응용 프로그램의 일부간 낭비에서 창호의 추상화.결국 이러한 응용 프로그램을 많이 낭비의 순간을 느끼 같은 응용 프로그램에서더 코더,기술는 내부와 외부.더 좋은 느낌을(열심히 작업을 마지막으로 수행,모든 것이 끝나고 정확한에 따라,이 개념에서 용지),그리고 고객에게"그냥을 배울 필요로 하는 것처럼"때문에,이잖아"전문가"..인,죄송합니다,나는 빗나가;-)

론,틀림없이,이 모든 것은 주관적인,하지만 제 경험(Ruby on Rails 제외,그것은 다를 수 있습니다,나는 영 실제적인 경험으로 하는 접근 방식).

유료 프로젝트,자주 들었고 수요를 시작으로 만드는 일부"active"기록으로는 빌딩 블록에 대한 높은 수준의 응용 프로그램 논리입니다.내 경험에서 이 눈에 띄게 자주 었의 어떤 변명을 위해 고객(소프트웨어 dev 회사에서 가장 많은 경우)있지 않았으로,큰기,대한 개요를 어떤 제품에 마지막으로 합니다.고객에서 생각하고 엄격한 프레임("프로젝트에서 십년 전에 그것은 잘했.."),그들은 육체 밖에 단체,그들은 엔터티를 정의 관계,그들은 어려움이 있을 수 있습 데이터의 관계를 정의하는 기본 응용 프로그램 논리,하지만 그들은 중지와 손으로 그것,당신을 생각해 그게 당신이 필요로하는 모든...그들은 종종이 부족한 완전한 개념을 응용 프로그램의 논리,사용자 인터페이스,가용성 및 그리고 중...그들이 부족은 큰 보고 그들은 사랑에 대한 세부 정보,그리고 그들이 원하신 것을 따라 AR 방법의 일이기 때문에..만,그것은에서 근무하는 프로젝트 년 전,그것은 사람들이 계속 바쁘고 침묵?모르겠습니다.그러나"내용"별도 소년에서 남자,또는..어떻게 원래 광고는 슬로건?;-)

몇 년 후(십 년간의 활발한 개발 경험이)때마다 고객이 언급하는"active 레코드 패턴",나의 알람 벨 반지입니다.내가 배운 것을 얻으려고 그들을 다시는 필수적인 단계개념호, 그들에게 두 번 생각하고,그 개념상 약점이나 그냥 그들을 피하기 위해서 모든 경우에 그들은 undiscerning(끝에서,당신은 알고,고객하지 않는 아직 알고 무엇을 원하고,어쩌면 그것은 생각을 알고 있지만하지 않거나 시도한 구체화하는 작업을 위해 나에게 무료 비용이 저에게 많은 귀중한 시간,일주 달 나의 시간,라이브가 너무 짧...).

그래서 마지막으로:이 모든 것은 내가 왜 싫어 바보"active 레코드 패턴",그리고 내가 하고 그것을 피할 때마다 가능합니다.

편집:심지어 호출이 없는 패턴이 있습니다.하지 않는 모든 문제를 해결(본은 의미하지 않을 만드는 구문 설탕).그것을 만들어 많은 문제가:루트의 모든 문제(에 언급된 많은 대답을 여기..),그 그냥 숨기 좋은 오래 잘 개발하고 강력한 SQL 뒤에는 인터페이스에 의하여 패턴을 정의 매우 제한적이다.

이 패턴 대체는 유연성으로 구문 설탕!

에 대해 생각하는,그것을 문제가 AR 를 해결을 위해 당신?

어떤 메시지가 나를 혼동된다.어떤 답을 하려고"ORM"vs"SQL"또는 이와 같습니다.

사실은 AR 은 그냥 단순화 프로그래밍 패턴을 활용해 귀하의 도메인에 객체를 작성 있는 데이터베이스에 액세스 코드를 받으시기 바랍니다.

이러한 객체는 일반적으로 사업 특성(properties of bean)고 어떤 행동(는 방법에는 일반적으로 이러한 속성에).

AR 단지 말 추가"어떤 방법을 이 도메인 개체를"데이터베이스 관련 작업과 관련이 있습니다.

을,내에서의 의견 및 경험이지 않는,다음과 같은 패턴이다.

첫눈에 반 사이 매우 좋습니다.일부 현대 Java 도구를 봄 같은 루 사용합니다.

나를 위해,진짜 문제는 그냥 OOP 관심사입니다.AR 패턴의 세력에서 당신을 어떤 방법으로 종속성을 추가하려면에서 당신의 개체 infraestructure 개체입니다.이러한 infraestructure 개체 도메인 개체를 쿼리 데이터베이스를 통해 방법을 제안합니다.

나는 항상 말한 두 개의 층은 성공에 중요하의 프로젝트입니다.서비스 층(는 bussiness 논리 있거나 내보낼 수 있습을 통해 어떤 종류의 원격 기술,웹 서비스로,예)도메인층이다.내 생각,우리가 추가하는 일부 종속성(정말 필요)에 도메인층 객체를 해결하기 위한 AR 패턴,우리의 도메인 개체를 어렵게 될 것입과 공유하는 다른 레이어 또는(희토류)외부 프로그램.

봄 Roo 의 구현 AR 재미있기 때문에,그것은에 의존하지 않는 객체 자체하지만,일부 AspectJ 파일이 있습니다.하지만 경우에 당신이 나중에 일하고 싶지 않으로 루에고 리팩터링,프로젝트 AR 방법이 될 것이 직접 구현 도메인에 있는 개체입니다.

또 다른 관점입니다.우리가 상상하지 않는 관계형 데이터베이스를 사용하여 저장하는 우리의 개체입니다.상상 응용 프로그램을 저장하는 우리의 도메인에 있는 개체 NoSQL 에 데이터베이스나에서는 XML 파일에 대한 예입니다.우리를 구현하는 방법은 다음 작업을 수행에 우리의 도메인을까?나는 그렇게 생각하지 않는(예를 들어의 경우,XM,우리는 추가 XML 관련 종속성을 우리의 도메인 개체를...정말 슬픈 나는 생각한다).왜 그런 다음 우리를 구현하는 관계 DB 방법을 도메인에 있는 개체 Ar 패턴 말?

요약하면,AR 패턴할 수 있는 사운드 간단하고 좋은 작고 간단한 응용 프로그램.지만,우리가 복잡하고 대형 응용 프로그램,생각은 고층 건물은 더 나은 접근 방법이다.

질문에 대해 활성 기록 디자인 패턴입니다.아 orm 도구입니다.

원래의 질문은 태그가 가진 레일 및 의미 트위터에서 건축되는 Ruby on Rails.이 ActiveRecord framework 에 레일이 구현하는 파울러의 활동 기록을 디자인 패턴입니다.

중요한 것은 본과 관련하여 불만 사항에 대해 활동을 기록할 때 모델을 작성 테이블 주위에,당신은 선택의 여러 인스턴스 모델은,당신은 기본적으로 하고"select*from...".이 편집하는 기록 또는 표시하는 기록은,하지만 당신이 원하는 경우,말,목록이 표시의 도시를 위해 모든 연락처 데이터베이스에서,당신이 할 수 있는"선택한 도시에서..."그만 얻을 수 있습니다.이와 함께 활동을 기록하는 것이 필요합니다 당신은 모두를 선택하는 열에만 사용하여 도시입니다.

물론,다양한 구현에서는 이것을 처리합니다 다릅니다.그럼에도 불구하고,그것은 하나의 문제를 해결합니다.

지금,당신은 주위에 얻을 수 있습니다 이를 만들어 새로운 모델에 대한 특정한 일을 하려고 시도하고 있지만,어떤 사람들은 변론하는 것보다 더 많은 노력합니다.

나 파 Active 기록합니다.:-)

HTH

내가 사랑하는 방법 아음속가 하나의 열만 것입니다.

DataBaseTable.GetList(DataBaseTable.Columns.ColumnYouWant)

, 또:

Query q = DataBaseTable.CreateQuery()
               .WHERE(DataBaseTable.Columns.ColumnToFilterOn,value);
q.SelectList = DataBaseTable.Columns.ColumnYouWant;
q.Load();

하지만 Linq 은 여전히 왕 때에 오른니다.

@밤:가끔 justed 구현되는 활동에 대한 기록의 결과입니다.지 않는 항상 있을 것이의 관계 테이블 <-->Active 기록합니다.왜"결과의 조인 문" <-->Active 기록이 있는가?

나는 이야기에 대해 활성으로 기록하는 디자인 패턴을 나는 보지 못했 ROR.

일부 개발자는 싫어한 활동을 기록하기 때문에,그들은 읽기 똑똑한 책을 쓰기에 대해 깨끗하고 깔끔한 코드,이러한 책국는 활동 기록을 위반하는 단일 resposobility 원칙을 위반하 DDD 는 규칙을 도메인해야 합 지속적인 무지,그리고 다른 많은 규칙에서 이러한 종류의 책입니다.

두 번째 것은 도메인에서는 기록하는 경향이 1-to-1 와 함께 데이터베이스,고려될 수 있는 제한의 어떤 시스템(n-tier 대부분).

그게 추상적인 것들이지 않았 ruby on rails 의 실제 구현합니다.

문제는 나와 함께 볼 Active 기록은,그것은 항상 그냥에 대 테이블.는 한,당신은 정말 작업 단지는 한 테이블,하지만 데이터로 작업하는 경우는 대부분의 경우에 당신은 몇 가지 종류의 가입하세요.

일반적으로 보다 더 아니 모든 가입 성능에 관해서,하지만 일반적으로 보다 더 "가짜"가입 먼저 읽고 전체적인 테이블 및 그 사용하여 얻은 정보를 읽고 표 B. 필터

문제 ActiveRecord 는 쿼리를 자동으로 생성한 성능 문제가 발생할 수 있습니다.

당신은 끝까지 하기는 어느 정도 직관적이지 않은 트릭을 최적화하는 쿼리를 떠나 궁금하신 경우에는 그것이었을 것입 시간을 더 효과적 작성하여 쿼리를 손에서 첫 번째 장소입니다.

지만 다른 모든 의견에 대한 SQL 최적화는 확실히 유효한 내 주요 불만을 가진 활성 레코드 패턴은 그것은 일반적으로 리드 임피던스 불일치.을 놓치고 싶지 않아 내 도메인을 깨끗하고 적절하게 캡슐화하는 활동 기록을 일반적으로 패턴의 모든 희망을 파괴하고있다.

일을 하려고 많은 많은 다형성은 관계이다.그렇게 쉬운 일이 아닙니다.특히 당신이 사용하지 않 STI.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top