2009-12-09 2 views
1

이전에 Ruby 또는 Rails로 작업하지 않은 개발자와 프로젝트를 진행하고 있습니다.Ruby 커뮤니티는 단순성을 중요하게 생각합니다 ... 새로운 프로젝트에서 DB 스키마를 단순화하기위한 논쟁은 무엇입니까?

그들은 내 생각에 너무 복잡한 스키마를 만들었습니다. 스키마에는 117 개의 테이블이 있으며, 가장 단순한 정보를 얻으려면 7 개의 탭을 통과하거나 결합해야합니다. 물론 이들 사이에는 일종의 키 역할을하는 "기본"테이블이 없습니다. 스키마는 'find'메소드와 같은 많은 레일 도구를 렌더링하며 많은 has_many/belongs 관계가 거의 쓸모가 없습니다. 그리고 이러한 모든 관계에 대한 코딩은 코드 작성 비용보다 많은 시간이 걸릴 것입니다.

질문 : 당신을 가정

는 제외 (스키마를 단순화 주장하는 방법, 스키마가 적합하지 않고, 도메인을 표현하는 여러 가지 방법이 있다는 것을 (도니는 다르게 ... 이럴) 아주 확신 내가 이미 말한 것에서)?

+1

"너무 복잡합니다"를 정의 할 수 있습니까? 도메인이 복잡하면 117 테이블이 반드시 과도하지는 않습니다. –

+0

이것은 더 많은 탐구 질문입니다. 정확한 대답이있는 질문이 아닙니다 ... "가장 좋아하는 프로그래밍 견적은 무엇입니까?"질문과 비슷합니다. 따라서 저는 사람들이 자신의 창조적 인 답변과 설명을 제시하기를 희망했습니다. 나는 실제로 당신의 마지막 답변을 즐겼습니다. 그리고 더 창의적이되고 싶다면, 자유롭게 느끼십시오! – btelles

답변

3

는 여기이 개 역할

  • DBA에 서 있습니다.
  • 개발자 : 응용 프로그램 개발자.

나는 DBA가 정말 모든 데이터베이스 트릭을 알고있는 사람입니다 가정합니다. Reaallyy Knows.


DBA :
데이터베이스 응용 프로그램의 주요하고 잘 최상의 성능과 그 목적을 제공하기 위해 미리 정의 된 구조를 가져야한다.
랜덤 스키마를 사용할 수없는 경우 (적절하게 표준화되고 적절 함) 도구가 잘못되었습니다.

데브 :
데이터베이스는 단지 데이터 저장소, 그래서 우리는 간단하게 응용 프로그램에 집중해야합니다.

DBA :
데이터베이스는 응용 프로그램의 핵심 저장소입니다. 데이터베이스가없는 응용 프로그램은 없습니다.

Dev :
아니요. 응용 프로그램이 핵심입니다. 프런트 엔드 및 비즈니스 논리가 적용되지 않은 응용 프로그램은 없습니다.

전쟁이 시작됩니다.


두 포인트 모두 유효하며 항상 상쇄됩니다.

데이터베이스가 RoR에서만 사용되는 경우 간단한 저장소과 같이 사용할 수 있습니다. DB를이 다른 응용 프로그램 사용할 수 있습니다 또는이이 몇 가지 모범 사례을 적용해야하는 데이터 많은 양 높은 트래픽 을 사용할 경우
.

일반적으로 DBA에 동의 할 수없는 방법은 없습니다.
그러나 그들은 당신의 상황을 이해할 수 있으며 표준을 약간 풀어 생산성을 높일 수 있습니다.

그래서 은 모두 함께 작업해야합니다 ().

는 그리고 당신은 데이터베이스가 또는 그렇게해야하는 이유를 설명하고, 점을 증명하기 위해 서로 이야기해야합니다.
그렇지 않으면 팀이 고장 났고 프로젝트가 실패 할 확률이 높습니다.


ActiveRecord는 매우 유용한 도구입니다. 그러나 그것은 당신을 위해 모든 것을 할 수는 없습니다. 기본적으로 정확하게 예상되는 데이터베이스 구조는 제공하지 않습니다. 그래서 그것은 조정되어야합니다.

반대쪽. DBA가 모든 PK가 개발자의 삶을 더 쉽게 만들 수있는 자동 증가 정수 (ActiveRecord가 기본적으로 수행합니다)를 받아 들일 수있는 경우.

개발자가 DBA 제약 조건 중 일부를 수락하면 DBA의 업무가 쉬워집니다.

당신이하지 을 주장

가 수행 스키마를 단순화 주장 할 것이다 방법 :


지금 귀하의 질문에 대답합니다. 팀을 만나 메시지를 전달하고해야 할 일을 지적하십시오.
어쩌면 그렇게해서는 안되며 모든 것을 알지 못하거나 어쩌면 뭔가를 모르는 것일 수 있습니다.

데이터베이스의 일반 구조에 동의하고 RoR 마이그레이션을 메타 언어로 사용하여 설명하려고 시도 할 수 있습니다.

이 방법을 사용하면 일반적인 그림을 볼 수 있으며 훌륭한 ActiveRecord를 사용할 수 있습니다. 또한 모두가 같은 페이지에 있습니다.

+0

아주 잘했다, 드미트리. 나는 특히 '논쟁'에 대한 선의의 태도를 좋아한다. – btelles

2

DB 스키마는 도메인과 그 관계를 반영해야합니다.

비정규 화는 성능 문제가 있음을 측정 한 경우에만 수행해야합니다.

7 조인은 지나치게 좋거나 나쁘지 않습니다. 적절한 인덱스가 있어야합니다. 데이터베이스 관리자/디자이너 :

+0

Ayay ... : -/... 나는 "도메인을 설명하는 여러 가지 방법이 있습니다."라는 토론에 참여하지 않기를 바랬습니다. 하지만 질문의 일부분을 만들어야한다고 생각합니다. 나는 질문에서 "비정규 화"라는 단어를 제거하고 적절하게 편집 할 것입니다. – btelles

2

이 인수를 체인 위로 올리는 일반적인 방법은 비용을 기반으로합니다. 간단하게 작업하면 코드가 줄어들고 버그가 줄어 듭니다. 시스템을 더 빨리 또는 더 많은 기능으로 구축 할 수 있으므로 더 많은 ROI를 창출 할 수 있습니다. 당신이 그 접근 방식으로 선내에 돈 관리자를 얻을 수 있다면, 그 또는 그녀는 당신이 팀에 조건을 지시하게 할 것입니다.극단적 인 over-normalization이 나쁜 데이터를 막는 것에 대한 반대 의견이 있지만, 복잡성으로 인해 더 많은 오류와 더 많은 데이터베이스 코드가 일반적으로 발생하기 때문에 이것이 사실이 아니라는 것을 발견했습니다.

여기에서 아키텍처 및 기술적 논증은 간단합니다. Ruby on Rails를 사용하기로 결정했습니다. 따라서 ActiveRecord 패턴을 사용하기로 결정했습니다. ActiveRecord 패턴은 데이터베이스 테이블이 개체 모델과 일치하도록 만들어집니다. 이것이 여기서 사용되는 패턴이며 많은 다른 장소에서 극단적 인 데이터 정규화를 적용하려는 모범 사례는 단순히 적용되지 않습니다. Patterns of Enterprise Application Architecture 사본을 사서 페이지 160에 작은 빨간 책갈피를 넣어 아키텍처 관점에서 패턴이 어떻게 작동하는지 이해할 수 있도록하십시오.

DBA 유형은 ActiveRecord가 쿼리 생성, 계단식 삭제, 낙관적 잠금, 자동 채워진 열, 버전 관리 (acts_as_versioned), 소프트 삭제 (acts_as_paranoid 포함) 등으로 얼마나 많은 작업을하는지 알지 못하는 경향이 있습니다. DBA가 유지 관리해야하는 사용자 정의 코드와 비교하여 이러한 작업을 수행하기 위해 잘 테스트 된 커뮤니티 지원 라이브러리 기능을 사용하는 것이 좋습니다.

DBA의 실제 문제는 다음과 같은 작업이 필요하다는 것입니다. 성능 모니터링, 코드에서 느린 쿼리 찾기, 인덱스 작성 및 백업 수행에 중점을 둡니다.

정상적인 스키마에 대한 정치적 전투가 끝나면 DataMapper로 전환하는 것이 좋습니다. PoEAA의 다음 패턴입니다. 당신이 할 수있는 다른 일은 객체 모델에 해당하는 뷰를 데이터베이스에 생성하는 것입니다. 이 방법을 사용하면 뷰를 기반으로하는 ActiveRecord 모델에서 많은 찾기 기능을 사용할 수 있지만 사용자 정의 삽입, 업데이트 및 삭제 방법이 있습니다.