2008-09-26 3 views
16

데이터베이스를 디자인 할 때 유의해야 할 중요한 사항은 무엇입니까?데이터베이스를 설계 할 때 유의해야 할 중요한 사항은 무엇입니까?

저는 다른 사람들도 귀하의 통찰력으로부터 혜택을 누릴 수 있다고 확신하므로 귀하의 대답을 제한하고 싶지 않습니다. 그러나 나는 멀티 클라이언트 커뮤니티 기반 사이트를위한 컨텐츠 관리 시스템을 계획 중이다.

+0

나는 이것이 좋은 질문이라고 생각하지만 제목이 약간 명확해질 수 있다고 생각했습니다. 동의하지 않으면 편집을 취소 할 수 있습니다. –

+0

커뮤니티 위키가되어야합니다 –

답변

37

"아파요까지 정상화, 작동까지 드-정상화."(성능 드 normalisations는 일반적으로 나중에 필요한 곳에 따를 수 있습니다)

+0

전에는 들어 본 적이 없습니다 ... 멋지다! – cagcowboy

+0

최상의 방법! – willasaywhat

+1

이것은 내 벽에 갈 것입니다 –

9

당신이 그것에 대해 수행 할 SQL 쿼리를 상상해보십시오.

많은 일을하기 때문에 이것은 중요합니다!

1

LOT를 실행하려고하는 쿼리가 있으면 저장 프로 시저로 만듭니다. 그들은 거의 항상 더 빠르게 실행됩니다.

+1

이 증거가 있습니까? 나는 그것이 사실이 아니며 어떤 견고한 벤치 마크도 발견하지 못했다고 생각합니다. –

+0

이것은 쿼리 실행 속도를 높이 든 아니든 상관없이 좋은 방법입니다. –

1

기본 키 이외의 필드를 기준으로 행을 찾으려면 해당 키를 색인 생성해야합니다.

+0

좋은 팁이긴하지만 실제 디자인상의 문제는 아닙니다. IMO –

14

경우에만 정확한 데이터가 처음에 데이터베이스에 저장 될 수 있도록 제약 (CHECK, NOT NULL, FOREIGN KEY, PRIMARY KEYDEFAULT)를 사용해야합니다. 항상 더 빠른 하드웨어를 구입할 수는 있지만 더 정확한 데이터를 구입할 수는 없습니다.

0

큰 키 집합을 기본 키로 사용하지 마십시오

+0

다중 열 기본 키가있는 테이블을 참조하는 모든 테이블에 해당 열이 있어야합니다. – Powerlord

+0

외래 키에 항상 대체 키를 사용할 수 있기 때문에 반드시 그런 것은 아닙니다 (적어도 MS SQL에서는). 메인 테이블에 FK가있는 테이블로 컬럼을 옮기는 것도 나쁜 일이 아닙니다. 추가 공간은 일반적으로 얻을 수있는 다른 장점과 비교하여 중요하지 않습니다. –

+0

프로그램에서 코드의 변수에서이 열을 모두 수행해야하는 것은 지루한 일입니다. –

1

객체 지향 언어입니까? 따라서 데이터베이스 앞에 개체를 모델링 해보십시오. 그러면 모델에 집중할 수 있습니다.

1

가능한 한 많은 요구 사항을 이해하십시오. 그런 다음 요구 사항이 변경되거나 SQL을 사용하지 않는 완전히 다른 종류의 데이터베이스로 마이그레이션하는 경우에만 변경해야하는 논리 스키마를 설계하십시오. 그런 다음 디자인을 수정하여 특정 DBMS 제품, 볼륨,로드 및 속도 요구 사항을 고려한 실제 디자인으로 확장하십시오.

정상화하는 방법을 배우고 정규화 규칙을 위반하는시기도 배웁니다.

7

몇 가지 사항을 명심하십시오. 모든 테이블에 레코드를 고유하게 식별 할 수있는 방법이 있는지 확인하십시오. 이렇게하면 엄청나게 많은 시간을 절약 할 수 있습니다. 당신이 모든 일을 천천히하기를 원하지 않는 한, 정규화하지만 큰 다중 열 자연 키에 가입하지 마십시오. 대신 상위 테이블에서 자동 생성되는 숫자 키를 사용하십시오.

예. 실행해야 할 쿼리 및 보고서의 종류에 대해 생각해보십시오. 확장성에 대해 생각해보십시오. 주문 표에 10 개 이상의 제품 열이 필요하지는 않지만 원하는 경우에는 어떻게 될지 모르는 것처럼 보일 수 있습니다. 11. 주문 표와 주문 세부 표를 갖는 것이 더 좋습니다.

모든 데이터 무결성 규칙이 데이터베이스에 통합되어 있는지 확인하십시오. 모든 데이터 변경이 사용자 인터페이스에서 발생하는 것은 아니며 설계자가 모든 규칙을 GUI에 넣어도 괜찮다고 생각했기 때문에 엉망인 데이터베이스를 너무 많이 수정해야했습니다.

우선 순위 지정시 고려해야 할 가장 중요한 사항은 데이터 무결성을 보장하는 방법 (데이터가 무의미한 경우 데이터베이스가 쓸모없는 경우)과 두 번째로 성능을 보장하는 방법입니다. 성능이 좋지 않은 경우를 제외하고는 관계형 데이터베이스를 설계 할 때 오브젝트 모델을 사용하지 마십시오.

다음으로 가장 중요한 것은 데이터 보호 및 보안입니다. 사용자는 절대로 데이터베이스 테이블에 직접 액세스해서는 안됩니다. 디자인에 동적 SQL이 필요한 경우 해당 액세스 권한이 있어야합니다. 이것은 SQL 주입 공격과 같은 것들을 통한 잠재적 인 해킹의 관점에서 나쁘지 만 더 중요한 것은 내부 사람들이 사기를 저지를 수 있도록 데이터베이스를 열어 놓는 것입니다. 데이터를 암호화해야하는 필드가 있습니까 (신용 카드 정보, 비밀번호 및 사회 보장 번호는 암호화되지 않은 상태로 저장해서는 안되는 항목들입니다). 이를 어떻게 계획하고 데이터를 볼 필요가 없을 때 사람들이 해독하지 않도록 해독을 감사 할 계획을 어떻게 세우고 있습니까? 법적인 문제가 있습니까? (HIPPASarbanes Oxley)

14

일관된 명명 표준을 정립하십시오. 장기간에 걸쳐 불필요한 사고를 몇 분 줄여줍니다. (이것은 아이러니하다고 읽을 수는 있지만 심각한 것입니다.)

극히이 아닌 한 아무 것도 생략하지 마십시오. 데이터베이스를 라이센스 판 메시지 추측 게임으로 바꾸지 마십시오. 1 년 후에 뚜렷하지 않은 것이 놀라운 것입니다.

0

정규화는 모델링하는 내용과 관련이 있습니다. 아마도 도메인의 객체 컬렉션을 모델링하고있을 것입니다. 같은 데이터가 두 번 이상 적용되기 때문에 데이터가 반복되는 일련의 이벤트를 기록한 것일 수 있습니다. 두 가지를 뒤섞 지 마라.

0

귀하의 데이터에 대해 잘 알고 정상화하는 것에 동의합니다.

뭔가 다른 제안은 아주 큰 텍스트를 별도의 테이블에 유지하는 것입니다. 예를 들어 계약을 체결 한 경우 계약에 대한 많은 정보를 한 테이블에 보관하고 합법적 인 (매우 큰) 문서를 별도의 테이블에 보관할 수 있습니다. 메인 테이블의 색인을 법적인 문서에 넣기 만하면됩니다.

+0

왜? 내 말은, 당신이 SELECT * FROM Table을하고 있다고 말하지 마라. – Luk

+0

이 충고는 구현에 따라 다름 (DB 엔진 끝). 필자는 PostgreSQL 또는 Oracle과 관련이 있다고 생각하지 않지만 잘 모릅니다. 거기에 * 어딘가에 질문이 있으니까 ... – voyager

1

성능 또는 기타 유지 관리상의 이유로 전술적 인 표준화 해제를 따르는 것이 중요합니다. 그러나 몇 가지 테이블 이상을 가질 것으로 예상되는 경우 정규화에 대한 한 가지주의 사항을 제시하여 테이블 수가 늘어 나면 훨씬 쉽게 작업을 수행 할 수 있습니다.

주의 사항은 각 테이블의 기본 키를 하나의 숫자 열 (DB의 풍미에 맞게)로 만드는 것입니다. 학술 표준화에서는 개념 (행)에 대한 인스턴스를 고유하게 식별 할 수 있도록 엔티티 (테이블)의 속성 (열)을 결합하여 멀티 컬럼 복합 기본 키로 끝낼 수 있습니다 . 따라서 복합 키를 외래 키로 다른 테이블로 마이 그 레이션 할 때마다 에있는 여러 개의 열을 복제하여 모든 테이블을 참조하는 테이블에 복사하게됩니다. 네가 6 개의 테이블 만 가지고 있다면 그것은 당신에게 도움이 될 것입니다. 그러나 당신이 그것보다 훨씬 더 크게 갈 때 그것은 빨리 떨어져 있습니다.

그래서 다중 열 복합 기본 키 대신 엄격한 정규화 교훈 중 일부에 위배되는 경우에도 순차 숫자 기본 키를 사용하십시오.

4

진정한 데이터베이스 개발자가 작성한 자료 모델링에 관한 정말 좋은 책을 얻으십시오. "실제 세계"에서 어떻게 완료되는지를 가르치려는 .NET 개발자는 아닙니다.

데이터베이스 디자인의 문제 공간은 이와 같은 포럼에서 크게 다루기에는 너무 큽니다. 그럼에도 불구하고, 나는 약간의 개인적인 포인터를 줄 것이다 :

정상화에 관한 위의 글을 들어라. 성능상의 이유로 여러분이해야한다고 생각하기 때문에 결코 비정규 화하지 마십시오. 실제 성능 문제가 발생한 후에는 비정규 화해야합니다 (이상적으로는 제작이 아닌 품질 관리 환경에서). 그렇다면 쿼리를 작성하거나 먼저 인덱싱을 개선하는 더 좋은 방법이있을 수 있다고 생각하십시오.

가능한 한 많은 데이터를 제한하십시오. 열은 가능한 한 NULL이 아니어야합니다. CHECK 제약 조건과 FOREIGN KEY를 사용해야한다. 이 작업을 수행하지 않으면 잘못된 데이터 으로 데이터베이스에 침투하여 많은 두통과 특수 사례 프로그래밍이 발생합니다.

실제로 테이블 디자인을 시작하기 전에 데이터를 검토하십시오. 프로세스 흐름 방식 및 추적해야 할 데이터를 잘 파악하십시오. 언뜻 보면 엔티티라고 생각하는 것이 종종 두 개의 엔티티로 판명됩니다. 예를 들어, 제가 작업하고있는 시스템에서 이전 디자이너는 멤버 테이블을 만들었고 애플리케이션의 모든 정보는 멤버 테이블의 일부였습니다. 회원은 애플리케이션에 있던 데이터를 변경하려고 할 수 있지만 원래 애플리케이션이 어떻게 보이는지 추적해야하므로 애플리케이션은 실제로 자체 엔티티이고 회원은 처음에 채워질 수있는 엔티티입니다. 신청서. 즉, 광범위한 데이터 분석을 수행하고 테이블 생성을 시작하지 마십시오. 지금이를 옹호하는 여러 게시물이 있었다 때문에

+0

나는 당신이 성능상의 이유로 생각했기 때문에 '절대 비정규 화하지 마십시오.' –

4

, 나는 한 가지 더 ...

이 당신의 모든 테이블에 ID 열을 가하고의 함정에 빠지지 마십시오을 추가합니다. 현대 데이터베이스 설계 이론이 실제 기본 키를 사용하고 엄격한 학문적 이유가 아닌 많은 좋은 이유가 있습니다. 나는 수백 개의 테이블을 포함하는 데이터베이스를 다루었는데, 그 중 다수는 수백만 개의 행 테이블이었고 1000 명 이상의 동시 사용자가 있었고 실제 기본 키를 사용하면 "고장"을 일으키지 않았습니다.

모든 테이블에서 ID 열을 사용한다는 것은 데이터베이스를 가로 질러 여러 테이블 조인을 수행해야한다는 것을 의미합니다. 이는 큰 번거 로움입니다. 또한 실수로 데이터베이스 디자인을 촉진하는 경향이 있으며 그 이상의 경우에도 중복 행 문제가 발생합니다. 또 다른 문제는 외부 시스템을 다룰 때이 ID를 전달해야한다는 것입니다.

대리 ID를위한 장소가 있습니다. 유형 코드 테이블과 개념 테이블 (예 : 규칙에 실제 식별자가없는 경우 시스템 규칙 테이블에서 ID를 사용할 수 있음). 그것들을 사방에 사용하는 것은 실수입니다.

오랜 논쟁의 여지가 있지만, 그것은 그것이 가치있는 일인가에 대한 제 의견입니다.

+3

그것은 논쟁이 아닙니다. 대리 키는 데이터를 유지 보수 가능하게 만듭니다. "자연 키 (Natural Keys)"또는 "실제 키 (Real Keys)"는 때로는 실제 세계를 반영하는 이상한 제한을가하지만 다른 경우에는 관계형 모델을 반영합니다. –

+0

당신의 의견이 유일한 유일한 것이라고 생각하는 것이 오만하다면 그것은 "논쟁이 아닙니다"입니다. 앞에서 말했듯이 필자는 수백 개의 테이블에서 측정 된 데이터베이스로 작업했으며 데이터는 쉽게 유지 관리 할 수있었습니다. 제한 사항은 실제 제한 사항이거나 모델이 문제입니다. –

+0

문제는 "현명한 사람이 관리 할 수 ​​있습니까?" 분명히 똑똑하고 관리 할 수 ​​있습니다. 문제는 불변의 대리 키를 넣지 못하면 데이터베이스가 할 수있는 것과 수행 할 수없는 것에 대해 이상하고 기발한 제한을 초래한다는 것입니다. –

0

중요한 것은 구조가 변경 될 수 있다는 것입니다. 그래서 구석에 자신을 설계하지 마십시오. 당신이하는 일이 언젠가는 다른 공간으로 데이터를 옮길 수있는 "방"과 심지어 길을 남겨야합니다.

4

데이터는 영원합니다. 처리가 시작됩니다.

관계형 모델을 실제 세계의 고 충실도 표현으로 가져옵니다. 이것은 무엇보다도 중요합니다.

처리 과정은 수년간 변화하고 발전해 나갈 것입니다. 그러나 데이터와 데이터 모델은 동일한 속도와 유연성으로 발전 할 수 없습니다. 프로세싱을 추가 할 수는 있지만 마술처럼 정보를 추가 할 수는 없습니다.정보를 삭제하고 싶지는 않지만 무시할 수 있습니다.

오른쪽을 받으십시오. 다이어그램의 엔티티와 관계는 일반 사용자가 아닌 일반 사용자에게 합리적인 의미를가집니다. 어플리케이션 프로그래밍조차도 간단하고 명확하며 정확해야합니다.

모델에 어려움이있는 경우 문제를 해결하기 위해 크고 복잡한 쿼리 또는 (최악의) 저장 프로 시저를 만들지 마십시오. 절차상의 해결 방법은 값 비싼 실수입니다. 자신이 갖고있는 것을 이해하고, 무엇을하고 싶은지, YAGNI 원리를 적용하여 본질에 맞게 처리하십시오.

1

최대한 많은 메타 데이터가 모델에 인코딩되어 있는지 확인하십시오. 데이터 모델을 보면서 거의 모든 비즈니스 규칙 또는 개념을 추론 할 수 있어야합니다.

즉, 사용자의 현실을 반영하는 이름을 선택해야합니다 (모델에 도움이되는 경우 현실감을 변경하는 것을 두려워하지 않아야 함).

데이터베이스에서 사용할 수있는 모든 제약 조건을 인코딩합니다. 합리적인 데이터 만 제공하려면 응용 프로그램 계층에 의존하지 마십시오. 의미있는 데이터 만 첫 번째 위치에 존재할 수 있는지 확인하십시오.

모델에서 집계 데이터를 수행하지 마십시오. 모델을 가능한 한 원자 적으로 유지하십시오. 즉시 집계하거나 정기적 인 집계 작업을 집계 테이블로 실행하십시오.

스키마간에 올바른 파티션을 선택하십시오. 일부 파티셔닝은 외래 키, 일부는 순수한 물리적 분리로 수행하는 것이 좋습니다.

2

나는 이것이 알려졌지만 정상화, 정규화, 정규화가 핵심이라는 것을 알고있다. 어떤 이유로 든 비정규 화되지 않은 형식으로 데이터를 저장해야한다고 생각하는 경우가 있습니다. 이는 뷰 또는 별도의보고 데이터베이스에서 처리해야합니다. 다른 주요 조언은 가능하면 text/ntext 필드를 피하는 것입니다.

2

"데이터베이스의 엄지 손가락 규칙 - 항상 아래로 두드립니다!"

예 : 당신이 우편 주소와 배송 주소와 대금 청구 주소에 대한 열이있는 고객 테이블이있는 경우 CancellationReason01, CancellationReason02와 CancellationDetails 테이블이있는 경우 ... 주소를 입력

와 별도의 CustomerAddress 테이블을 작성 , CancellationReason03 .. 별도의 CancellationReason 테이블 만들기

+1

CancellationReason01, CancellationReason02, CancellationReason03이있는 CancellationDetails 테이블이있는 경우 ... ** 끔찍하고 끔찍한 혼란 **이 있습니다. 우리 시스템에는 그 중 일부가 있습니다. – voyager

2

실용 가능. 목표가 무엇인지 염두에두고 불필요한 복잡성을 만들어내는 것은 미쳐 버리지 마십시오. 나는 몇 가지 설정이 있습니다

  • 가 null 값의 전체 폭 사람을 통해 좁은 테이블을 선호
  • 작은 테이블의 수를 유지합니다.
  • 정규화는
  • 트리거는 일반적으로

매우 고통스러운 그러나 이러한 목적의 수단 일 수 있습니다 (많은 경우에 모순 및주의 균형을 필요로), 중요한 것은이 요구 사항을 수 있도록하는 것입니다 일반적으로 좋은 디자인을 운전하십시오. 별도의 엔티티가 무엇인지, 다른 엔티티의 일부가 무엇인지, 고양이 음식 (어떤 사람인지 신경 쓰지 않는 것)은 전적으로 귀하의 요구 사항에 달려 있습니다.

+1

나는 반드시 당신과 의견이 맞지 않지만, 나는 약간의 테이블과 작은 테이블을 모두 추천한다는 오락으로 주목합니다. 이것은 "작은 데이터 저장"으로 요약 할 수 있습니다. 중복을 피하는 데 도움이되기 때문에 꽤 좋은 권고라고 생각합니다. :-) –

+0

@Jeffrey : 당신 말이 맞아, 확실히 균형 잡힌 행동이 필요합니다. 조인이나 더 넓은 테이블 같은 것들? –

0

기본 키는 시퀀스 생성 번호만큼 만들 수 있습니다.

관련 문제