2

다음 상황에서 두 가지 db 스키마 접근 방식 중 어느 것을 채택해야하는지 혼란 스럽습니다.검색 및 정렬에 가장 효율적인 두 가지 MySQL DB 스키마 접근법은 무엇입니까?

웹 사이트에 여러 속성을 저장해야합니다. 예 : 페이지 크기, 단어 수, 카테고리 등이 있으며 향후 속성 수가 증가 할 수 있습니다. 목적은이 테이블을 사용자에게 표시하는 것이며 데이터 사이에서 신속하게 필터링/정렬 할 수 있어야합니다 (따라서 테이블 구조는 빠른 쿼리 & 정렬을 지원해야합니다). 또한 변경 일정을 유지하기 위해 이전 데이터의 로그를 유지하려고합니다. 그래서 내가 생각 한 두 테이블 구조 옵션은 다음과 같습니다

옵션 A

website_attributes는

ID, website_id, PAGE_SIZE, WORD_COUNT, CATEGORY_ID, title_id를, ... .. (최대 18 개의 열로 이동하면서 몇 개의 null 값이있을 수 있으며 앞으로도 더 많은 열을 추가해야 할 수도 있음을 명심해야합니다.)

웹 사이트 일부 속성이 다른 테이블에 연결도 정렬 할 때 "change_update_time"

내가이 스키마의 장점을 느낄에 대한 추가 열이 위와 같이

동일한 테이블 strucuture을 _attributes_change_log하면 쿼리도 쉽게 작성할 수있을 것입니다 간단합니다. 단점은 ALTER TABLE이 큰 데이터 테이블에서 실행되는 데 오래 걸리면 많은 컬럼이있는 많은 행이있을 수 있으므로 나중에 컬럼을 추가하는 것이 문제가 될 수 있다고 생각합니다.

옵션 B

website_attribute_fields

은 attribute_id, ATTRIBUTE_NAME (예컨대 PAGE_SIZE) attribute_value_type (예컨대 INT)

website_attributes

ID, website_id, ATT ribute_id, attribute_value, last_update_time

이점은 언제나 열을 추가 할 수 있고 저장 공간을 절약 할 수 있다는 점에서이 접근법의 유연성 인 것으로 보입니다. 그러나이 접근법을 채택하는만큼 테이블을 표시해야 할 때 쿼리 작성이 특히 복잡 할 것입니다. [여러 사이트에 대한 레코드를 한 번에 표시해야하며 상호 참조도 필요합니다. 특정 속성에 대해 다른 테이블과의 값] + 데이터 정렬은 어렵습니다 [이것이 컬럼 기반 접근법이 아닐 때].

나는 것보고 할 것입니다 무엇의 샘플 출력 :

Site-A.com, 232,032 바이트, 232 개 단어, 홍보 사, 부동산은 [카테고리 테이블에 연결] ..

Site-B.com, ..., ..., ..., ...

사용자는 모든 숫자 기반 열을 기준으로 정렬 할 수 있어야하므로 접근 방법 B가 어려울 수 있습니다.

그래서 옵션 A를 사용하여 옳은 일을하고 있는지 또는 처음부터 고려하지 않은 다른 더 나은 옵션이 있는지 알고 싶습니다.

답변

2

를 얻을해야 장기 실행 사용하여 ALTER 표를 pt-online-schema-change.

곧 출시 될 MySQL 5.6에서는 non-blocking ALTER TABLE 작업을 지원합니다.

옵션 B는 Entity-Attribute-Value 또는 EAV라고합니다. 이로 인해 관계형 데이터베이스 디자인의 규칙이 깨져서이 형식의 데이터에 대해 SQL 쿼리를 작성하는 것이 어려워졌습니다. 아마도 regret using it 일 것입니다.

EAV의 함정을 설명하는 posted several times on Stack Overflow이 있습니다.
내 블로그에 또한 : EAV FAIL.

+0

downvote를 준 사람에게 : 책임을 져야하고 왜 그 대답이 페널티를받을 자격이 있다고 생각하는지 설명하십시오. 아마 나는 그것을 향상시킬 수있다. –

0

옵션 A는 더 나은 방법이지만, 추가 열 추가, 쿼리 및 정렬 옵션에 대한 경고 테이블이 더 빠를 때 시간이 길어질 수 있습니다. 나는 전에 옵션 A와 같은 디자인을 사용했고, 테이블에 수백만 개의 레코드가있는 동안 경고 테이블을 만들 때 너무 오래 걸리지 않을 것입니다.

0

더 유연하고 사용량이 적기 때문에 옵션 2를 선택해야합니다. option1을 사용할 때 램에 많은 내용을 가져와야하므로 페이지 오류 가능성이 높아집니다. 데이터베이스의 쿼리 시간을 늘리려면 당신은 도전적으로 색인 데이터베이스 내가 당신의 고통을 완화 할 수 있습니다 옵션 A.

를 사용하는 것이 좋습니다 빠른 결과

0

나는 옵션 A가 좋은 디자인이 아니라고 생각합니다. 좋은 데이터 모델을 설계 할 때 장래에 테이블을 변경해서는 안됩니다. 도메인 SQL 언어의 경우, 옵션 B의 조회를 사용하는 것이 어렵지 않습니다. 또한 실제 문제의 해결책은 "일부 웹 페이지의 일부 속성 (최종 속성이 아닌 열린 속성)을 저장해야하므로 해당 속성의 표현을위한 엔티티가 존재합니다."

-1

옵션 A를 속성으로 사용하십시오 고정되어있다. 여러 속성을 기반으로하는 쿼리가 있으므로 두 번째 모델의 데이터를 쿼리하고 처리하는 것이 어려울 것입니다.