2011-05-09 2 views
1

내 테이블에 휴가 위치 목록이 포함 된 다수의 부울 필드가 있습니다. 데이터가 아약스에 의해 브라우저에서 가져오고 나는 많은 모바일 사용자를 가지기를 바라고, 비트 연산자로 사용할 정수로 결합했습니다. 너무 많은 필드가 있기 때문에 (32 개 이상) 필자는 필드를 그룹화하고 각 그룹에 대해 정수를 생성해야했습니다. 그래서 난 내 데이터 테이블에 추가 필드에서 그 정수를 저장비트 단위 데이터 유지 보수하기

[ 
    things: int("100"), 
    animals: int("10") 
] 

같은 것을 매핑됩니다

[ hasCar: 1, hasBoat: 0, hasTree: 0, hasCat: 1, hasHorse: 0] 

(간단한 의사 코드 (실제로 PHP)를 사용하고 있습니다). 이것의 문제점은 매우 융통성이 없다는 것입니다. 예 : 부울 필드를 그룹화하는 방법을 변경하거나 모든 부울 필드를 그룹화하는 방법을 변경하면 모든 정수를 다시 생성하고 각 항목의 데이터를 덮어 씁니다.

효율적이고 유지 보수가 용이 한 방식으로 비트 단위 데이터 생성을 처리하는 방법에 대한 좋은 아이디어가있는 사람이 있습니까?

답변

0

비트 연산자를 효과적으로 사용하려면 2^0, 2^1, 2^2, ... 즉 1, 2, 4, 8, 16 등의 값을 지정하십시오.
이제 이러한 값을 db에 저장하면 이러한 값을 합계하여 한 열에 저장할 수 있습니다.

예. 당신은이 값 [ hasCar: 1, hasBoat: 2, hasTree: 4, hasCat: 8, hasHorse: 16] 을했고 사용자 hasTree, 당신은 다음과 같은 쿼리를 사용할 수 있는지 조회하기를 원한다면 :

SELECT * from TABLE WHERE Col & 4 = 4 
+0

좋은 생각이지만 ... a) 필드를 재 그룹화하려는 경우 (예 : hasBoat, hasCar, hasHorse를 하나의 정수 "transport"에 넣으려는 경우와 같이 여전히 희생양이됩니다. b) 모든 부울 필드가 1 비트에서 더 큰 크기로 바뀌면 데이터베이스 크기가 대폭 증가합니다 – wheresrhys

+0

단일 열을 사용하여 모든 값을 저장할 수 있습니다. 정수 열은 약 20 개의 값을 수용 할 수 있어야합니다. 값을 합하여 하나의 열에 넣으면됩니다. – Tushar

0

이 데이터베이스 정규화의 얼굴에 파리를.

확실히 공간을 효율적으로 사용하지만 'hasCat'을 사용하여 모든 레코드를 쿼리하려면 어떻게해야합니까? Tushar의 열거 형을 사용하고 SQL에서 부울 arith를 수행하면 모든 쿼리에 대해 전체 테이블 스캔을 실행해야합니다.

은 별도의 두 테이블을 설정합니다

CREATE TABLE thingType (
    id INTEGER AUTOINCREMENT, 
    description varchar(20), 
    PRIMARY KEY (id) UNIQUE KEY lookup (description) 
); 
CREATE TABLE hasThing (
    thing_id INTEGER, locn_id INTEGER 
    PRIMARY_KEY (locn_id, thing_id) 
); 

예, 그 없습니다 거의 공간 effieicent 등 - 유용하고 적응하지만 확장 성.