webapp의 각 클라이언트에 대해 새 테이블을 작성하는 것이 좋을 수 있습니까?


10

이것은 반 가상적이며 대규모 데이터베이스 테이블을 다루는 경험이 없으므로 어떤 이유로 든 이것이 끔찍한 지 전혀 모릅니다. 상황에 따라 :

웹 기반 응용 프로그램을 상상해보십시오. 회계 소프트웨어는 20,000 명의 클라이언트가 있고 각 클라이언트에는 1000 개 이상의 항목이 있습니다. 그것은 내가 알고있는 2 천만 개의 행으로 복잡한 쿼리 속도를 확실히 늦출 수 있습니다.

이런 경우 각 클라이언트에 대해 데이터베이스에 새 테이블을 만드는 것이 더 합리적입니까? 데이터베이스가 20k (또는 그 이상) 테이블을 갖는 데 어떻게 반응합니까?

답변:


15

일반적으로 말하자면, 아니요, 고객 당 테이블 (실제로 데이터베이스를 의미한다고 생각합니다)이 의미가 없습니다. 데이터베이스 테이블의 경우 2 천만 행이 상대적으로 작습니다. 데이터베이스가 올바르게 조정 (인덱싱)되고 쿼리가 올바르게 구성되는 한 쿼리 속도는 문제가되지 않습니다. 20,000 개의 개별 데이터베이스를 관리하는 데 따른 추가 복잡성으로 인해 별도의 이점으로 얻을 수 있다고 생각하는 이점이 무엇이든 상쇄됩니다. 예를 들어, 테이블 구조를 변경하려고하면 어떻게됩니까? 이제 20,000 번해야합니다!

최악의 경우, 데이터베이스 크기가 문제가되는 것을 발견 한 후에는 나중에 별도의 데이터베이스로 분할 할 수 있습니다.


아니요, 문자 그대로 데이터베이스 내의 테이블을 의미했습니다. 클라이언트 당 데이터베이스를 작성해야하는 이유를 상상할 수 없습니다. 그리고 2 천만 행이 작다면, 무엇입니까? 그리고 그 시점에서 무엇을합니까?

1
@ChrisF, 정확하게-기술 또는 비즈니스 모델이 클라이언트마다 별도의 DB를 요구하는 경우가 많이 있습니다. 그러나 동일한 DB 내에서 별도의 테이블이 필요한 이유는 생각할 수 없습니다 .
GrandmasterB

1
@GrandmasterB-@Will이 잘못된 질문을하고 있다고 생각합니다.
ChrisF

1
@Will : 가능하면 Oracle User Group 회의 또는 다른 고급 데이터베이스에 해당하는 회의로 이동하십시오. "작은"및 "큰"에 대한 아이디어는 많은 재조정이 필요하다는 것을 알 수 있습니다. 그것은 나에게 일어났다. 힌트 : 하나의 디스크에 맞으면 DBA 표준에 따라 크지 않습니다.
David Thornley

1
@Gorton, InnoDB는 일반적으로 속도와 안정성, 동시성에 대해 더 나은 MyISAM으로 간주됩니다. 따라서 특정 애플리케이션의 예상 데이터베이스 사용량을 기반으로 다른 스토리지 엔진을 평가해야합니다.
GrandmasterB

5

나쁜 생각 인 것 같습니다.

이국적인 구조로 데이터베이스를 능가하려고하지 마십시오. 데이터베이스 엔진은 대규모 데이터 세트를 처리하기 위해 많은 최적화로 설계되었습니다. 예를 들어, 설명하는 것은 수동으로 인덱스를 구현하려는 시도와 거의 비슷합니다. DB 엔진에서 제공하는 인덱스 만 사용하면 직접 수행 할 수있는 것보다 훨씬 더 나은 성능을 구현할 수 있으므로 유지 관리가 많이 필요하지 않습니다.

또한 일반적인 경험 법칙입니다. 응용 프로그램을 정상적으로 사용하는 동안 데이터베이스 구조 (테이블, 필드)를 조작하거나 생성 해야하는 방식으로 데이터베이스를 설계하지 않는 것이 좋습니다. 성능 최적화를 어렵게 만들고 잠재적으로 보안 허점을 생성하는 일상적인 작업을 수행 할 수있는 권한을 사용자에게 너무 많이 부여합니다.


허용되는 경우 두 단락 각각에 대해 한 번 투표했습니다.
David Thornley

3

다음은 사람들이이 질문을 할 때 항상 읽을 것을 권장하는 기사입니다.

http://datacharmer.blogspot.com/2009/03/normalization-and-smoking.html


나는 DB가 테이블 당 실제 파일을 생성한다는 것을 몰랐다 = x
Will

1
실제 사용 된 RDBMS에 따라 달라질 수 있습니다. MySQL은 그렇게합니다 (MyISAM을 사용하는 경우 테이블 당 최대 3 개의 파일). 다른 사람들은 그렇지 않을 수 있습니다.
Mchl

SQL Server의 엔터프라이즈 버전은 그렇게 설계하면 자동으로 수행되지 않습니다.
JeffO

오라클은 분명히 그렇게하지 않습니다.
user281377

오라클 SQL Server와 같은 방식으로 그렇게 할 수 있지만 왜 테이블 당 하나의 파일을 갖도록 스키마를 설계했는지 상상할 수 없습니다. 데이터베이스를 여러 파일로 분할하는 것은 의미가 있지만 테이블 당 하나의 파일은 아닙니다.
Dean Harding

1

단일 테이블 IMHO는 문제가되지 않으므로 아직 존재하지 않는 문제는 생성하지 마십시오. 성능을 돕기 위해 할 수있는 일이 많이 있습니다. clientID 또는 날짜 필드를 기반으로 단일 테이블을 여러 파일로 분할하여 IO에 도움을 줄 수 있습니다. DB는 사이트에 필요한 모든 쿼리에 대해 20,000 개의 서로 다른 SQL 문을 추적, 최적화 및 캐시 할 필요가 없습니다. clientid로 색인을 생성 할 수 있습니다. 20K 클라이언트는 많은 하드웨어 비용을 지불 할 수 있습니다.

이 유형의 테이블에는 NoSQL 유형 db를 사용할 수 있습니다.

20K 클라이언트의 경우 데이터베이스가 가장 약한 링크가 아닐 수 있으므로 왜 이렇게 많은 복잡성이 발생합니까?


`IO에 도움을주기 위해 clientID 또는 날짜 필드를 기반으로 단일 테이블을 여러 파일로 분할 할 수 있습니다. 어떤 설명이 있습니까?

운영 체제에 여러 파일이 있습니다. 서버는 하나의 파일 대신 많은 파일에 대한 읽기 / 쓰기를 더 많이 수행 할 수 있습니다.
JeffO

나는 그런 의미에 대해 들어 본 적이 없습니다.이 작업에 대한 자세한 정보는 어디서 찾을 수 있습니까? :-)하지만 구글을 공격합니다 ~

msdn.microsoft.com/ko-kr/library/ms345146(v=sql.90).aspx 인덱스가 인덱스 된 테이블 (또는 드라이브?)과 다른 파일에있는 경우 백업 성능 문제가 발생할 수 있습니다.
JeffO

0

정말 나쁜 접근법입니다.

테이블을 세로로 분할하고, 홀수 사용자 ID 용으로 2 개의 데이터베이스 서버를, 다른 서버에서도 제대로 작동해야합니다 (데이터는 사용자간에 관련이 없음).

user_id를 기준으로 데이터를 정렬하고 이것이 불가능한 경우 엄청난 양의 RAM 또는 SSD 디스크를 확보하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.