2012-06-26 2 views
0

현재 PHP, 자바 스크립트 및 MySQL을 사용하여 웹 응용 프로그램을 디자인하고 있습니다. 데이터베이스에 대한 두 가지 옵션을 고려하고 있습니다.토너먼트 관리 소프트웨어 용 데이터베이스 디자인

토너먼트 ID와 함께 기본 정보가 저장된 모든 토너먼트에 대한 마스터 테이블을 보유하고 있습니다. 그런 다음 각 테이블 이름에 토너먼트 ID가 추가 된 디비전, 대괄호, 일치 등의 테이블을 만듭니다. 그런 다음 해당 토너먼트에 액세스 할 때 "SELECT * FROM BRACKETS_ [여기에 토너먼트 ID 삽입]"과 같은 간단한 작업을 수행합니다.

내 다른 옵션은 각 레코드가 해당 토너먼트 (또는 괄호, 대괄호와 일치하는 부분 등)에 적절한 외부 키에 연결되어있는 일반 대괄호, 구분, 일치 등의 테이블을 갖는 것입니다 기둥.

첫 번째 접근 방식에 대한 우려는 저에게 너무 비싸고 데이터베이스가 매우 빨리 지저분해질 수있는 것처럼 보입니다. 두 번째 접근 방식에 대한 나의 우려는 성능입니다. 이 프로그램은 국제적이지는 않더라도 국가가 될 것입니다. 한 테이블에 많은 레코드가있는 것을 염려하고 있습니다. 너무 많은 사람들이 동시에 그것을 치면 문제가 발생할 수 있습니다.

데이터베이스 관리와 관련해서는 완전히 새로운 것이 아닙니다. 그러나 이것은 내가 솔로로 완전히 한 첫 번째 것입니다. 그래서 모든 도움이 인정됩니다. 감사!

+0

실제로이 테이블에 어떤 것을 저장해야합니까? 토너먼트에 참가한 누가, 누가 이겼고, 누가 어떤 팀에 팀이 있는지, 어떤 상장이 있고, 어떤 상을 수여 했습니까? 일단 모든 것을 갖추면 데이터베이스 스키마를 쉽게 찾을 수 있습니다. –

+0

나는 아직도 그 문제를 해결하고 있지만, 나의 질문은 그것보다 좀 더 일반적이다. 나는 더 적은 수의 행을 가진 많은 테이블을 가지거나 더 많은 행을 가진 적은 수의 테이블을 갖는 것이 더 나은가, 아니면 그것이 효과가 있는지 묻고있는 것 같다. 언젠가 내일 나는 각 테이블에 무엇이 있는지에 대한 자세한 목록을 게시 할 것이다. –

답변

3

각 토너먼트에 대한 테이블을 만들지 마십시오. 테이블은 엔터티의 유형이며 엔터티의 인스턴스이 아닙니다. 이러한 개념을 혼합하면 유지 보수성과 확장 성은 무서울 것입니다.

이 프로그램은 국제적이지 않은 국가 일 수도 있지만, 단일 테이블에 너무 많은 레코드가 포함되어있을 가능성이 높습니다. 동시에 많은 사람들이 동시에이를 때릴 수도 있습니다. 문제가 발생할 수 있습니다.

각 레코드에 대해 전체 테이블을 만들어야하는 경우 지구는 어떻게 그 수준으로 확장됩니까?

두 번째 접근 방식의 성능과 관련하여 왜 걱정합니까? 이러한 우려를 뒷받침하는 구체적인 측정 항목이 있습니까? 관계형 데이터베이스는 이 매우 많아 관계형 데이터를 쿼리하는 데 매우 적합합니다. 따라서 관계형 데이터를 유지하십시오. 독창성을 발휘하여 사용중인 데이터베이스 기술의 디자인을 훼손하지 마십시오.

  • 대회
  • 부문
  • 브라켓
  • 일치
  • 경쟁자

이 우 :

님의 엔티티의 몇 가지 유형을 명명 한 나는 테이블을 좋아한다. 데이터를 쿼리하는 방법에 따라 인덱스를 관리합니다 (즉, 인덱스를 초과하지 않거나 삽입/업데이트/삭제로 비용을 지불합니다). 데이터를 적절하게 표준화하고 감사 및보고가 더 많이 발생하는 위치를 정형화합니다. 성능에 대해 걱정이된다면 데이터에 액세스하는 방법에 대한 쿼리 실행 경로를 주시하십시오. 약간의 비틀기는 큰 차이를 만들 수 있습니다.

미리 성숙하지 마십시오. 실제적인 이유없이 복잡성이 추가됩니다.

+0

또한 'BRACKETS_ [여기 tournamentID 여기에 삽입하십시오]'와 같은 것들에 대해 컴파일 된 뷰를 생성하고 그것들 중에서 선택할 수 있습니다. – David

+0

실제 엔티티의 이론적 접근법과 엔티티 유형을 포함한 답변에 감사드립니다. 그 추론은 저의 머리를 다른 개념으로 감쌀 수있게 해줍니다. 감사합니다! –

2

먼저 저장할 항목을 찾으십시오. 토너먼트, 이벤트, 팀, 경쟁자, 상금 등과 같은 것들이 있습니다.이 엔티티 각각은 아마도 테이블 일 것입니다.

각각에 대해 기본 키를 갖는 것이 일반적입니다. 때로는 행을 고유하게 식별하는 열 (또는 열 그룹)이 있으므로 기본 키로 사용할 수 있습니다. 그러나 대개 ID 또는 이와 유사한 숫자 유형의 열을 사용하는 것이 가장 좋습니다. RDBMS가 이러한 열에 대한 색인을 작성하고 사용하는 것이 더 빠르고 쉽습니다.

데이터가 속한 곳에 저장하십시오. prizes 테이블이 아닌 events 테이블에 이벤트의 날짜와 시간이 표시됩니다.

또 다른 중요한 점은 First normal form을 준수한다는 것입니다. 이는 데이터 원 자성을 보장하기 때문입니다. 이것은 나중에 두통을 많이 줄여주기 때문에 중요합니다. 이 작업을 올바르게 수행하면 올바른 수의 테이블도 갖게됩니다.

마지막으로 중요한 것은 검색어에 가장 자주 나타나는 열에 관련 색인을 추가하는 것입니다. 이것은 성능 향상에 많은 도움이됩니다. 너무 많은 행이있는 테이블에 대해 걱정하지 마십시오. RDBMS-es는 요즘 테이블을 수억 개의 행으로 처리하므로 효율적으로 처리 할 수 ​​있습니다.

+0

"수억 개의 행"- 맞아. 많은 개발자들이 "많은 양의 데이터"로 작업하고 있으며 수천 개의 행, 수만 가지의 행을 말하는 것으로 들었습니다. "많은 데이터"의 규모에서 수천 개의 행이 통계적으로 0 행과 구별 할 수 없습니다. – David

+0

대부분의 개발자는 데이터 크기 때문에 데이터베이스가 느리다는 것을 1 백만 행으로 위아래로 뛰어 오르기 시작했습니다. 나는 테이블에 15 억 개의 행이나 750GB가 넘는 데이터를 가지고 일했으며 서버로부터 좋은 응답을 받았다. 모든 데이터베이스의 핵심은 바로 디자인을 얻는 것입니다. 제작에 들어가기 전에 제대로 이해하지 못한다면 즐거운 시간을 가지지 못할 것입니다. – Namphibian

+0

답변 해 주셔서 감사합니다. 나는 여러 답을 받아 들일 수 있었으면 좋겠다. 그러나 위의 것은 제가 대답으로 찾고자했던 것보다 조금 더 많습니다. 하지만 당신의 대답은 그저 좋았습니다. 또한 내가 데이터베이스 성능에 대해 생각한 것을 확인해 주셔서 감사하지만 확실하지는 않습니다. 따라서 질문입니다. –

1

항목의 새 인스턴스가 나타날 때마다 새 테이블을 만드는 아이디어는 정말 안 좋은 일입니다.

  • 귀하의 코드는 새로운 부문이든이 생성 될 때마다 자동으로 테이블을 추가해야합니다 :이 나쁜 생각하는 이유

    A (확실히 불완전한) 목록입니다. 이것은 분명히 나쁜 습관이며 극히 틈새 시장으로 제한되어야합니다. 경우

  • 당신은 오류가 발생하기 쉽고 큰 유지 보수 두통에게 (예를 들어, 새로운 필드를 추가) 당신이 가실 것입니다 수백 테이블의에 추가해야합니다
  • 를 추가하거나 나중에 테이블 구조를 수정하기로 결정 RDBMS는 테이블 및 관련 (인덱스, 트리거, 제약) 요소가 아닌 행에 맞게 확장되므로 에 대해에 대해 작업하고 있습니다.
  • 이 사람은 진정한 클린저가되어야합니다 - "일요일에 경기했던 모든 경기를 나열하십시오"또는 "프랭크 페리가 활동적이었던 가장 최근의 3 개의 괄호를 찾으십시오"와 같은 요청을 어떻게 처리 할 계획입니까?

당신 말 :

는 데이터베이스 관리에 올 때 나는 완전한 newb 아니에요; 그러나 이것은 내가 완전히 솔로 한 첫번째 작품입니다 ...

새로운 세트가 필요할 때마다 테이블이 복제 된 다른 프로젝트를 기억할 수 있습니까? 그렇다면이 접근법에 몇 가지 문제점을 발견하지 못했습니까? 그렇지 않다면 DBA가 어떤 이유로 든 절대 수행하지 않을 것이라고 정확히 생각한 적이 있습니까?

+0

제가 일한 대부분의 프로젝트는 각 클라이언트에 대해 전체 db를 생성하는 작업을 포함하여 서비스를 제공 한 모든 사람을 위해 복제 된 테이블을 작성했습니다. 나는 몇 가지 문제점에주의를 기울 였고, 그래서 여기에 와서 의견을 묻기 시작했다. 나는 아직도 나 자신을하는 법을 배우기 때문에 어느 하나 또는 다른 이유를 아직 보지 못했다. 통찰력과 도움에 감사드립니다. –

+0

제 4의 요점은 명심하십시오 : 별도의 테이블에 데이터를 분산 시키면 대부분의보고/집계가 불가능합니다. 아이디어를 즉시 삭제하는 것은 # 1 가지 이유입니다. 그러한 보고서가 버전 1.0에 대한 요구 사항이 아니더라도 나중에 만들 가능성은 전혀 없습니다. –

+0

당신이 언급 한 시나리오 (신규 고객을위한 테이블 복제)는 다른 고객을 완전히 분리하고 고객 데이터 세트 하나만 백업하는 등의 의미가 있습니다. 이 경우 이러한 이유 중 어느 것도 적용되지 않으며 설계가 많은 제한을 초래한다는 점을 이해하십시오. –

1

코드의 품질과 유지 보수성을 손상시키는 것 외에도 (다른 사람들이 지적했듯이) 실제로 성능을 얻을 지 여부는 의심 스럽습니다.

당신이 실행

...

SELECT * FROM BRACKETS_XXX 

합니다 ... DBMS는 이름이 "BRACKETS_XXX"를 일치하는 테이블을 찾을 필요하고 검색 자체가 무리 인 DBMS'es 데이터 사전에서 이루어집니다 테이블. 따라서 테이블 내의 검색을 데이터 사전 테이블 내의 검색으로 바꿉니다. 당신은 검색의 가격을 어느 쪽이든 지불합니다.

(사전 테이블 또는 "진짜"테이블, 그리고 수도 있고 실제 테이블과 유사한 성능 특성이 없을 수 있습니다, 그러나 나는 이러한 성능 특성 에 대한 "정상"테이블보다 더 나은 될 가능성 내기하지 않을 수도 있습니다 행 번호 큽니다. 또한, 데이터 사전의 성능이 가능성이 문서화해야합니다 그리고 당신이 정말로 문서화되지 않은 기능에 의존해서는 안됩니다.)

는 또한, DBMS 갑자기 (prepare 더 많은 SQL 문에 필요 그들은 이후 별도의 표를 참조하여 다른 진술), 추가 사전을 제시합니다. 성능에 의지합니다.

관련 문제