배경
저는 CS 학생입니다. 아빠의 소기업을 위해 아르바이트를하고 있습니다. 실제 응용 프로그램 개발 경험이 없습니다. 저는 파이썬으로 스크립트를 작성했고 C에서는 몇 가지 코스워크를 작성했지만 이와 같은 것은 없습니다.
아빠는 소규모 교육 사업을하고 있으며 현재 모든 수업은 외부 웹 응용 프로그램을 통해 예약, 기록 및 추적됩니다. 내보내기 / "보고서"기능이 있지만 매우 일반적이며 특정 보고서가 필요합니다. 쿼리를 실행하기 위해 실제 데이터베이스에 액세스 할 수 없습니다. 맞춤 보고서 시스템을 설정하라는 요청을 받았습니다.
내 생각은 일반적인 CSV 내보내기를 만들고 매일 밤 사무실에서 호스팅되는 MySQL 데이터베이스로 가져 와서 필요한 특정 쿼리를 실행할 수있는 것입니다. 데이터베이스에 대한 경험은 없지만 기본 사항을 이해합니다. 데이터베이스 작성 및 일반 양식에 대해 조금 읽었습니다.
우리는 곧 해외 고객을 확보하기 시작할 수 있으므로 데이터베이스가 폭발 할 경우 폭발하지 않기를 바랍니다. 우리는 또한 현재 여러 부서 (예 : ACME 모회사, ACME 건강 관리 부서, ACME 보디 케어 부서)를 가진 대기업을 고객으로두고 있습니다.
내가 생각해 낸 스키마는 다음과 같습니다.
- 클라이언트 관점에서 :
- 고객이 메인 테이블입니다
- 고객은 근무하는 부서에 연결되어 있습니다.
- 런던 HR, 스완 지 마케팅 등 전국에 부서가 흩어져있을 수 있습니다.
- 부서는 회사의 부서와 연결되어 있습니다
- 부서가 모회사와 연결됨
- 수업 관점에서 :
- 세션은 메인 테이블입니다
- 선생님은 각 세션에 연결되어 있습니다
- 각 세션에 statusid가 제공됩니다. 예 : 0-완료, 1-취소
- 세션은 임의 크기의 "팩"으로 그룹화됩니다.
- 각 팩은 클라이언트에게 할당됩니다
- 세션은 메인 테이블입니다
나는 종이에 스키마를 "디자인 (더 이상 낙서처럼)"하여 3 차 형식으로 정규화하려고 노력했다. 그런 다음 MySQL Workbench에 연결하여 모두 나에게 좋게 만들었습니다 :
( 대형 그래픽을 보려면 여기를 클릭하십시오 )
(출처 : maian.org )
내가 실행할 예제 쿼리
- 신용이 남아있는 고객 중 아직 활동이없는 고객 (향후 수업이없는 고객)
- 고객 / 부서 / 구간당 참석률은 얼마입니까 (각 세션의 상태 ID로 측정)
- 한 달에 교사의 수업 수
- 출석률이 낮은 고객에게 신고
- 부서에있는 사람들의 출석률이있는 HR 부서에 대한 사용자 정의 보고서
질문
- 이것이 과도하게 설계되었거나 올바른 방향으로 가고 있습니까?
- 대부분의 쿼리에 여러 테이블을 조인해야 성능이 크게 향상됩니까?
- 아마도 일반적인 쿼리 일 것이므로 클라이언트에 'lastsession'열을 추가했습니다. 이것이 좋은 생각입니까, 아니면 데이터베이스를 엄격하게 정규화해야합니까?
시간 내 줘서 고마워
divisions
이라는 열이 divisionid
있습니다. 중복이 없습니까? 그냥 이름을 지정하십시오 id
. 또한 다음을 포함한 테이블 이름 _has_
: 예를 들어 제거하고 이름을 지정하십시오 cities_departments
. 당신의 DATETIME
열 유형을 사용해야 TIMESTAMP
가 사용자 입력 값을가 아니라면. 테이블 cities
과 countries
테이블 을 갖는 것이 좋습니다 . 테이블을 단일로 제한하는 데 문제가 발생할 수 있습니다 status
. 에 대한 사용을 고려 INT
하고 비트 단위로 비교를 수행하면 더 많은 의미를 가질 수 있습니다.