2011-05-05 3 views
0

나는 mysql을 배우고 있으며 데이터베이스 작업을하고있다. 지금까지는 모든 것이 잘되었지만 질문이있었습니다. 나는 회사 재무 제표 (대차 대조표, 손익 계산서 테이블, 현금 흐름 테이블 등)를 조직하고 있으며 대부분의 회사는 분기 별 성명 (감사받지 않음)과 연간 진술서 (감사 대상)를 보유하고 있습니다. 지금은 각 문장에 대해 연간 또는 분기별로 플래그를 지정하는 열이 있습니다.콘텐츠 또는보기를 기반으로 테이블을 만드는 것이 더 좋습니다?

다른 사람이 감사 및 감사받지 않은 진술에 대한 보고서를 동시에 실행하지 않을 가능성이 있으므로 감사를위한 테이블과 감사되지 않은 테이블을 만드는 것이 가치가 있다고 생각했습니다. 내가 이것이 결국 데이터라고 생각한 이유는 상당히 커질 것이고 나는 테이블이 작을수록 더 빠른 성능이라고 생각했습니다.

그래서 데이터베이스를 디자인 할 때 콘텐츠를 기반으로 설계해야합니까 (예 : 관계없이 모두 동일한 그룹으로 그룹화해야하나요?) 또는 사람들이 어떻게 액세스 할 것인가에 따라 그룹화해야합니까?

이 내가 같은 나라 내가 지적하는 모두의

답변

1

전체적인 문제를 알지 못하면 명확하게 대답 할 수 없습니다.

그러나 일반적으로 단일 테이블이 시스템의 각 논리 엔터티를 나타내기를 원합니다. 그것의 소리에서, 분기 별 및 연간 명세서는 동일한 논리적 개체를 나타내지 만 단일 범주 열/필드에 따라 다릅니다. 국가 문제에 대해서도 마찬가지입니다. 유일한 차이점이 국가 (분류)이면 모두 동일한 테이블에 저장해야합니다.

데이터를 범주별로 별도의 테이블로 분할하면 데이터가 여러 테이블에 분산되어 쿼리하기가 어려워집니다. 예를 들어, 시스템의 모든 명령문을 계산하려면 모든 국가 테이블을 쿼리하고 결과를 함께 추가해야합니다.

편집 : Joe Celko는이 반 패턴 "Attribute Splitting"을 호출합니다.

+0

감사합니다. Phil, 내 문제를 이해한다고 생각합니다. 어쩌면 내 질문에 더 많은 MySQL의 색인 및 검색 방법에 관련이 있지만 데이터베이스 효과 성능의 크기는 무엇입니까? 예를 들어, 모든 캐나다 기업에 대해 분기 별 평균 수익을 검색하면 (이 데이터베이스는 다른 모든 국가의 행뿐만 아니라 연례/분기 별 데이터도 많이 포함하고 있음) 질의가 고통스럽게 느려지므로 비 관련 데이터 톤? – Lostsoul

+0

현대의 RDBMS에서 적절하게 설계된 테이블은 중간 정도의 적절한 하드웨어에서 실행되는 경우 (수십억 개가 아닌 경우에도) 많은 행을 처리 할 수 ​​있습니다 (적절히 색인이 생성 된 경우 등). 나는 당신이 정말로 거대한 데이터 세트에 대해서 이야기하지 않는 한 퍼포먼스에 대해 염려하지 않을 것이다. (심지어 카테고리별로 데이터를 분리하기 전에 다른 옵션을 찾는다.) –

1

먼저 내 90 % 아래로 우리 회사에서 countries..since 모든 분석을 재무 제표를 그룹화해야한다 제기 또 다른 질문, 내가 아니에요 전문 DB 디자이너. 하지만 내가 당신을 꾸몄다면 엔티티가 기본적으로 동일하기 때문에이 경우 하나의 테이블을 생성 할 것입니다.

라거 데이터 세트에서 mysql의 성능을 염려 할 경우 Postgres에서 앱을 빌드하는 것이 더 나을 것입니다. 복잡한 쿼리를 실행해야한다면 저장된 함수/프로 시저 또는 뷰를 사용하여 mysql의 성능을 향상시킬 수 있으며 물론 memcache 또는 SQL을 사용하여 SQL을 약간만 쉬게 할 수있다.

사용자가 주로이 레코드 유형 만 검색하면 3 개의 테이블을 만들 수 있습니다. 모든 기록에 대해 하나, 감사 및 비 감사 대상에 대해 하나 InnoDB의 트리거 (ON UPDATE/DELETE/INSERT)와 동기화 된 상태로 유지할 수있다. 그들은보기처럼 작동 할 수 있지만, 생각보다 (테스트되지 않은)보기가 더 빠를 것이라고 생각합니다. 이 경우 첫 번째 "큰"테이블 만 관리해야합니다. 감사 레코드를 삽입하면 트리거가 실행되어 감사 된 테이블에 레코드가 저장됩니다.

+0

나는 당신의 생각을 좋아한다. 내 견해에서 유일한 단 하나의 데이터베이스이지만, 데이터베이스를 분리하여 작업한다. 대규모 보고서 (예 : 전세계 추세 또는 기타 보고서)를 실행해야하는 경우 대형 데이터베이스를 직접 쿼리 할 수 ​​있습니다. 그 멋진 아이디어, 나는 그것에 대해서 생각조차하지 않았다. – Lostsoul

+0

3 테이블 접근법을 사용하지 말 것을 강력히 권장합니다. 나는 이것에 의해 어떤 위반도 의미하지 않는다. 그러나 이것은 간단하고 직선적 인 문제를 취하고 그것을 몇 가지 규모로 복잡하게 만든다. –

+0

나는 필자와 필자의 의견에 동의한다. 필자는 하나의 테이블 (필요한 경우 포스트그레스 사용)을 말했고, 세 개의 테이블 "아이디어"는 중복 된 데이터 등을 가져온다. – Damien

1

Phil과 Damien에 동의합니다. 하나의 테이블이 더 좋습니다. 원하는 것은 실제 업무용 유형 유형 당 하나의 표입니다. 테이블을 추상적 인 개념의 사물과 유사한 것으로 디자인하면 데이터 디자인이 시간의 테스트에 더 적합 할 수 있습니다.데이터가있는 실제 물건을 기반으로 스키마를 스케치 한 후에는 정상화 규칙을 적용하여 설계를 형식화 할 수 있습니다.

기본적으로 걱정되는 성능 문제를 디자인하는 것은 좋지 않지만 실제로 보지 못했습니다. 큰 테이블에 대한 직감이 느리면 실제로 틀릴 수도 있습니다. 대부분의 DBMS 시스템은 적어도 한 지점까지 더 큰 테이블을 좋아합니다. 테이블이 큰 경우 쿼리 최적화 프로그램은 인덱스를 사용하도록 선택합니다. 테이블이 작 으면 전체 테이블 스캔이 끝나기 때문에 동시 액세스가 실제로 느려질 수 있습니다. 테이블이 너무 커져서 DBMS의 기능을 능가하지 못한다면 더 이상 사용하지 않는 오래된 데이터를 보관하거나 더 확장 성있는 DBMS를 구입할 시간을 고려해야합니다.

관련 문제