2011-08-19 3 views
2

응용 프로그램이 파티셔닝 수단으로 데이터베이스 테이블을 동적으로 생성하는 것이 합리적입니까?파티셔닝 수단으로 테이블을 동적으로 생성 : OK 또는 나쁜 습관?

예를 들어, 각 행의 소유자를 식별하는 "userID"열이있는 큰 테이블 "위젯"이 있다고 가정 해보십시오. 이 테이블이 극단적으로 커지는 경향이 있다면, 응용 프로그램에 새로운 사용자마다 "widgets_ {username}"이라는 새 테이블을 생성하게하는 것이 합리적입니까? 응용 프로그램은 한 번에 단일 사용자에게 속한 위젯 만 쿼리해야한다고 가정합니다 (즉, 이러한 사용자 위젯 테이블을 함께 시도하거나 조인 할 필요가 없음).

이렇게하면 큰 테이블 하나를 더 쉽게 관리 할 수있는 덩어리로 분해 할 수 있지만 이는 훌륭한 해결책이 아닙니다. 내 생각에 데이터베이스 스키마는 응용 프로그램이 작성 될 때 정의되어야하며 런타임 데이터는 추가 테이블이 아닌 행으로 저장되어야합니다.

보다 일반적인 질문으로 런타임에 데이터베이스 스키마를 수정하는 것이 좋습니다.

편집 :이 질문은 대부분 가설입니다. 나는 런타임에 테이블을 만드는 것이 의미가 없다는 것을 꽤 잘 알고 있었다. 즉, 우리는 응용 프로그램에서 수백만 행의 테이블을 가지고 있다고합니다. SELECT는 훌륭하게 수행되지만 특정 사용자가 소유 한 모든 행을 삭제하는 것과 같이 시간이 걸릴 수 있습니다. 기본적으로 나는 각 사용자에 대한 테이블을 동적으로 생성하는 것이 내가 부탁 받았을 때 이해가되지 않는 견고한 추리를 찾고있다.

+1

왜 widgets-username 테이블이 많은 데이터베이스가 "username"이라는 추가 열이있는 테이블 하나보다 낫다고 생각하십니까? 올바른 인덱스와 함께 후자를 사용하십시오. – Konerak

+0

왜 귀찮게합니까? SELECT * 위젯에서 어디 userID = 'Fulano'실행하는 데 너무 오래 걸립니까? –

+0

"쉽게 관리"한다는 것은 무엇을 의미합니까? 테이블 쿼리 나 아카이브 같은 작업에 대해 이야기하고 있습니까? –

답변

6

아니요, 아니요, 아니요! 이제 나를 뒤따라, I will not do this because it will create many headaches and problems in the future! 데이터베이스는 많은 양의 정보를 처리하도록 만들어졌다. 그들은 색인을 사용하여 자신이 원하는 것을 빨리 찾습니다. 생각해보십시오 phone book 지수가 얼마나 효과적입니까? 각성에 대해 다른 책을 갖는 것이 더 낫겠습니까?

성능면에서 이점이 없습니다. 단일 테이블을 유지하면서 UserID에 대해 색인을 생성해야 데이터를 빠르게 얻을 수 있습니다. 그러나 테이블을 위로 나눈다면 모든 사용자에게 특정 위젯 검색, 특정 유형의 모든 위젯 계산 등 모든 정보를 얻는 것이 불가능합니다. 동적으로 구축되어야한다.

행 삭제가 느린 경우이를 살펴보십시오. 한 번에 얼마나 많은 행을 우리가 10, 1000, 100000에 대해 말하고 있습니까? 이 테이블의 클러스터 된 인덱스는 무엇입니까? "소프트 삭제"를 사용할 수 있습니다. 여기서 상태 열을 "D"로 업데이트하면 행이 삭제됨으로 표시됩니다. 나중에 데이터베이스 활동이 적어서 행을 삭제할 수 있습니까?다른 활동에 의해 차단되므로 삭제가 느립니다. 테이블을 깨기 전에 그것들을 들여다보십시오.

1

응용 프로그램이 파티셔닝 수단으로 데이터베이스 테이블 을 동적으로 생성하는 것이 합리적입니까?

호 (웃음)

+2

그래서 전체 텍스트에서 하나의 질문을 가져 와서 한 단어로 대답했습니다. 이 방법을 배우는 것은 다소 어려웠습니다 ... – Konerak

+0

그의 전체 텍스트 *는 *이 질문이었고 잘못된 질문이었습니다. "동적으로 테이블 생성"은 문제가되지 않습니다. OP의 문제는 분명히 멀티 테넌트 데이터베이스에서 느린 DELETE 성능입니다. –

3

아니, 그건 좋은 생각이 될 것입니다. 그러나 일부 DBMS (예 : Oracle)에서는 단일 테이블을 열 값으로 분할 할 수 있으므로 런타임에 새 테이블을 만들지 않고도 목표를 달성 할 수 있습니다. 그런 식으로 테이블을 파티션하는 것은 "표준"이 아니며 대개 매우 큰 데이터베이스에서만 수행됩니다.

2

userID의 색인을 사용하면 성능이 거의 비슷합니다.

제 생각에는 런타임에 데이터베이스 스키마를 변경하는 것은 좋지 않은 방법입니다. 예를 들어 보안 문제를 고려해보십시오.

관련 문제