2010-03-02 5 views
3

기본 질문을 용서하지만 데이터베이스 디자인의 영역에 대한 나의 새로운 점은 나를 묶는 데 자주 빠지게됩니다.MySQL DB 설계 도움말

나는 정보 계열에 관해 계속해서 성장하는 사이트가 있습니다. 처음에는 설명하는 항목 중 한 종류가 있었으며 모두 잘되었습니다. 그 아이템은 하나의 레코드를 차지했고 서술형 데이터에 기인 한 34 개의 컬럼을 가지고있었습니다. 이 자료에 점점 더 많은 것을 알게되면서 많은 개발자가 데이터를 (실제로는) 별개의 테이블로 분해한다는 것을 알게되었습니다.

원본 항목과 관련된 표가 추가되었지만 원래 항목을 설명 할 때 항상 필요한 것은 아니므로 불필요하게 쿼리되지 않도록 분리했습니다.

어쨌든, 내가 구성하려고 시도한 새로운 항목이 USER입니다. 사용자 테이블에는 username, email, last_login, 관련 이미지에 대한 경로 등의 일반적인 열이 있습니다.이 사용자는 사용자와 관련된 ID가있는 열과 해당 열과 관련된 항목을 포함하는 또 다른 표에 계속 코멘트를 남깁니다. 논평하고있다.

지금 ... 사이트에 의무적 인 사용자 프로필 페이지를 추가하는 중입니다. 필수 프로필 데이터 만 포함하는 다른 테이블을 만들거나 기존 사용자 테이블에 프로필 데이터가있는 기존 사용자 레코드를 추가해야합니까? 나는 사용자 기록, 사용자 프로필 기록 및 그 사용자 ID와 관련된 다른 데이터를 죽이는 무언가를 실행해야하므로 "사이트에서 제거"기능을 추가하려는 경우 정리 작업이 어려울 수도 있다고 생각합니다. 테이블.

기본적으로 나는이 "세분화 된"디자인 방법을 계속 사용하여 모든 것을 필수적인 부분으로 분해해야합니까? 아니면 더 큰 테이블로 통합하는 역할을합니까? 사용자가 계정을 삭제하면 관련성이없는 데이터가 잔뜩 남는 경우가 있습니다. 예를 들어, 원래 항목은 식당입니다 ... 식당에 "방문수"를 기록하기위한 테이블을 만들면 레스토랑 ID와 사용자 ID가 포함되며 사용자 또는 레스토랑이 사이트에서 제거되면이 "방문수"테이블은 "존재하지 않는 레스토랑은 사용자가 방문하지 않았습니다."또는 "레스토랑 21은 존재하지 않는 사용자가 방문했습니다"라는 쓸모없는 기록이 있습니다.

나는 여기에 의미가 있기를 바랍니다 ... 나는 단지 그것이 시간이 지나면이 "정크"데이터로 끝납니다.

덕분에 많이 롭

답변

2

는 "에 대한 관련"데이터가 응용 프로그램의 삶의 정상적이고 건강한 부분임을 삭제. 그것은 단지 일어나는 일입니다. 당신은 치아를 닦거나 침대를 만드는 것처럼 그것을해야합니다. 두 개 또는 세 개의 DELETE 쿼리가 테이블 구성 방법에 영향을주지 않도록하십시오. 그것들은 비싸지도 않고, 솔직히, 그것이 너무 고통 스럽다고 생각한다면, 당신은 틀린 사업을하고있는 것입니다. :)

InnoDB 테이블을 사용하고 있다면, 당신은 foreign key constraints을 볼 수 있습니다. 너를위한 청소의 일부.

+0

감사합니다. Soctt .... 나는이 모든 문제가 매우 주관적이고 상황과 관련이 있다고 생각하기 때문에 신용을 해결해 줄 것입니다. 나는 f k를 살펴볼 것이다. –

1

일반적으로 데이터가 모두 동일한 논리적 개체 (동일한 "물건")와 관련된 경우 동일한 테이블에 있어야합니다. 테이블을 작게 유지하기 위해 하나의 테이블을 두 개로 나누는 것은 일반적으로 좋은 생각이 아닙니다. 수행중인 작업에 따라 쿼리가 더 빨라지거나 생성되지 않을 수 있으며 불필요한 복잡성이 발생합니다. 설명하겠습니다.

데이터 쿼리의 속도 향상 여부는 데이터의 특성과 사용 방법에 따라 다릅니다."rambling_comments varchar (5000)"또는 일부와 같이 매우 큰 필드가 있고 거의 사용되지 않는 경우 별도의 테이블로 분리하여 "기본"테이블에 남아있는 것이 상대적으로 작도록하면 실제로 쿼리가 더 빨라 졌으므로 이제는 읽을 데이터가 거의 없음을 알 수 있습니다. 그러나 분리하려는 필드의 크기가 적당하지 않고 두 테이블의 데이터가 필요한 경우 한 테이블 만 사용하는 쿼리는 그다지 많은 이득을 얻지 못하며 둘 다 사용하는 쿼리는 이제 조인을 수행해야합니다 이것은 보통 더 큰 기록을 읽는 것보다 비용이 많이 듭니다.

그러나 테이블을 분리하면 프로그램이 더욱 복잡해집니다. 이제 어떤 데이터가 어떤 테이블에 있는지 추적해야합니다. 해당 필드가 Item_Descriptive_Data 테이블이나 Item_Stock_Data 테이블에 있는지 여부는 계속 확인하게됩니다. 어떤 시점에서 트랙을 잃어 버리고 우연히 동일한 필드를 두 개의 테이블에 넣어야 할 책임이 있습니다. (또는 더 나쁜 경우, 이것이 좋은 생각이고 고의적으로 결정할 것입니다.) 그런 다음 중복되고 잠재적으로 모순되는 데이터가 있습니다.

테이블을 교차하는 데이터가 필요할 때마다 조인을 수행해야합니다. 하나 이상의 테이블에 레코드가 존재하지 않을 가능성을 만듭니다. 마찬가지로 User 테이블을 User_Main 및 User_Profile로 분해하고 두 테이블의 데이터가 필요하므로 조인을 수행 할 때 User_Profile에 User_Main에 해당 레코드가없는 레코드가 있으면 어떻게됩니까? 코드를 추가하여 가능성을 확인하고 처리해야합니다. 아, 그리고 blithely "그것은 일어날 수 없다, 그것에 대해 걱정할 필요가 없다"는 말은 매우 위험한 태도 다 : 조만간에 일어난다는 것이지지되지 않는다하더라도 조만간 그럴 것이고 만일 당신이 잘못을 우아하게 다루지 않는다면, 너 진짜 엉망이 될 수있어.

요약하면 성능상의 이유로 테이블을 분할하는 것은 일반적으로 시기상조의 최적화입니다. 실제 성능에 문제가있는 것으로 판명되면 테이블을보고 효율성을 위해 비정규 화해야하는지 확인하십시오. 그러나 언젠가 언젠가는 발생할 수있는 문제를 피하기 위해 데이터베이스를 파기하지 마십시오.

+0

Gotcha Jay. 감사. 나는 테이블을 거대하게 만들고 나중에 쉬는 것이 더 쉽다고 생각한다. –