2011-03-29 4 views
0

사용 사례 : 호텔 객실 예약 가능.바이너리 시퀀스 저장/질의 rdbms는 그만한 가치가 있습니까?

정규 방법 :

이 열 가용성의 테이블 유무 : 365 행 (의미

가능 (INT) hotel_id, (날짜) 날짜, (부울) 우리는 일년 고려하는 경우 날짜

일을에 인덱스 호텔 당 가용성)의 난 시도하고 싶습니다 :

은 기둥, 트러스, 빔과 가용성의 테이블이 MNS (int)를 hotel_id (? BIGINT) 가용성

호텔 당

1 행, 비트 연산자를 사용하여 쿼리/업데이트 가능 여부를 확인하는 방법은 다음과 같습니다

SELECT * FROM table WHERE (availability & mask) = mask 

질문 :

성능 현명한 그만한 가치가 있니?

답변

0

크 누스 (Knuth)는 "조기 최적화는 프로그래밍의 모든 악 (또는 적어도 대부분)의 뿌리입니다." 막연한 현대 데이터베이스는 테이블에서 수백만 행을 처리 할 수 ​​있어야하므로 문제가 있기 전에 년 365 행/호텔/년이 상당히 많은 호텔 규모로 확장됩니다. 제안한 최적화는 쿼리를 손으로 디버그하는 것이 훨씬 어려워 지므로 상당한 유지 관리 비용을 부과합니다. 또한 테이블을 인덱싱하는 것이 훨씬 더 어려워집니다. 이는 대부분의 RDBMS 시스템이 인덱스를 잘 활용할 수 있지만 쿼리에서 비트 전송을 최적화 할 수있는 기능이 없기 때문에 큰 손실입니다.

실제로 이런 식으로 조사하기 전에 시스템에서 병목 현상으로 격리 된 잘 작성된 쿼리로 잘 색인화 된 데이터베이스를 가질 때까지 기다릴 것입니다. 솔직히 전통적인 RDBMS (무언가, 아마 MongoDB 또는 Cassandra)이 계획을 시도하기 전에 분산.

+0

2000 년 호텔, 호텔 당 1 개 이상의 제안, 제안 당 365 개 이상의 가용성 기록, 5 개 이상의 웹 사이트/앱 제공에 대한 귀하의 성명을 이해하고 완전히 동의하지만 귀하는 내 걱정을 이해할 수 있습니다. 아니 SQL DB를 접근 방식은 내가 정말 행복하게 공부할 수있을거야하지만 난 아직도 여기 어떻게 도움이 될지 모르겠다. 제안 해 주셔서 감사합니다. – redben

+0

저는 여전히 비트 마스크 솔루션에 대한 좋은 인덱싱을하는 것이 더 나을 것이라고 생각합니다. 2000 * 365는 아직 백만 열의 약 3/4에 불과하며 실제로 그렇게 큰 것은 아닙니다. DB에 병목 현상이있는 기존 시스템이 있습니까? 일반적으로 비트 마스크 솔루션을 사용하기 전에 Db/서버 구성, 쿼리 최적화 및 인덱싱을 모두 시도합니다. 비트 마스크를 추적 할 수 있다고해도 시스템을 상속하는 사람에게는 큰 골치 거리를 남기고 누군가는 결국 잘못된 정보를 사용하여 잘못된 데이터를 얻습니다. –

1

행 수가 10^7을 넘지 않으면 데이터베이스 엔진이 정상적으로 작동해야하므로 숫자가 주어지면 제안한 일반적인 접근 방식에는 아무런 문제가 없습니다. 비록 당신이 거기에 도착하더라도, 더 강한 서버 (확장 성)와 훌륭한 DBA는 당신이 더 확장 할 수 있도록 도울 수 있습니다.

사실 당신이 제안한 대안은 훨씬 나빠질 수 있습니다. 가용성 열을 적절하게 색인화 할 수 없을 것입니다. 따라서 날짜 별 쿼리가 격렬하게 느려질 것입니다.

예를 들어 다음과 같은 쿼리를 실행하고 싶을 것입니다. SELECT hotel_id FROM hotel_avail WHERE avaliable = TRUE AND avail_date = '2011-04-01'; 빠른 실행을 위해서는 날짜 열에 색인이 필요합니다.

또한 가용성과 마스크 구성을 롤링하면 시스템이 복잡해집니다. "가용성 마법"을 수행하는 코드를 이해하고 유지하는 것이 더 어려울 것입니다. 나를 믿어 라, 나는 거기에 있었다 - 처음에는 꽤 보일지 모르지만, 잠시 후에 너의 트릭이 어떻게 작동해야하고 악몽이되는지 자신을 기억할 수 없다.

마지막으로 언급 한 @ mark-tozzi와 마찬가지로 조기 최적화는 좋지 않은 아이디어입니다.최근 RDBMS가 최근에 얻은 모든 휴지통 이야기에도 불구하고 대개 예상보다 놀라 울 정도로 잘 수행됩니다. 또한 대개는 문제에 대한 가장 간단하고 신뢰할 수있는 솔루션을 제공합니다. 20 년 이상의 개발 기간이 필요합니다. 저는 일하는 수십억 개의 트랜잭션을 처리하는 웹 애플리케이션에 MS-SQL을 사용합니다. 일부 데이터베이스는 수억 개의 행과 테라 바이트의 저장 공간에 도달합니다. 우리는 또한 NoSQL (Riak, Couch, HBase)을 사용합니다 - 그러나 SQL은 단순히 갈 수없는 곳에서만 사용합니다. 이것은 시스템에 해당하지 않습니다.

+0

사실 내가 비트 방식으로 간다면 날짜별로 쿼리하지 않고 마스크로 (코드에서 int로 코드를 변환해야 할 것입니다). 쿼리는 바이어스 appraoch로 간단하게 보이지만 읽기 쉽지 않습니다. 정기적 인 접근 방식은 이해하기가 훨씬 쉽지만 너무 길지는 않습니다. (읽기도 쉽지 않을 것입니다 ...) 문제는 내가 한 날짜까지 쿼리하지 않을 것입니다 (체류 기간에 포함 된 모든 날짜를 확인해야합니다) . 내 정규 접근 방식의 테이블 정의가 효율적이지 않을 수 있습니다 ...? – redben

+0

다음 테이블 정의는 무엇입니까? – Elad

+0

"(int) hotel_id, (날짜) 날짜, (부울) 사용 가능" – redben

관련 문제