2010-12-27 2 views
3

내가 가지고있는 것 :사용자의 웹 사이트 권한을 저장하고 mySQL에서 쿼리하는 방법은 무엇입니까?

내 테이블에 사용자의 권한 문자열을 저장하는 privileges이라는 열이 있습니다. (-1 = owner, 0 = admin, 1 = moderate comment 등) 그래서 나는 sql : 1,2,3과 같은 문자열을 가질 것입니다.

는 문제 : 내가 관리자 및 운영자 모든 사용자를 선택하고 싶었

, 그것은 LIKE 조건에 조금 까다로운된다. 지금 당장, 관리자가 필요하면 모든 사용자가 1을 검색합니다 (PHP를 사용하면 비효율적입니다).

나는 플러그인 개발자가 쉽게 '꽂아'쉽게 쿼리 할 수있는 솔루션을 찾고 있습니다. 내 솔루션은 작동하지만 사용자가 수백 명으로 늘어날 경우 특정 권한을 찾기 위해 반복적으로 모든 작업을 반복적으로 수행 할 수 있습니다.

누구에게 더 좋은 방법이나 생각이 있습니까?

+0

관계형 데이터베이스 [사용자] - 투 - [역할]을 사용해야합니다 ... PHP로 루핑하는 것이 비효율적이라고 말하는가? 당신이 원하는 것을 얻기 위해서 당신은 LIKE 질의의 시작에 와일드 카드를 사용해야합니다 ... 그것을하는 최악의 방법. ACL을보십시오. – Alex

+0

@Alex - 필자는 확실히 mySQL의 초심자이지만, 'LIKE'를 사용하여 느린 쿼리를하는 것보다 데이터를주고받는 것이 덜 효율적이라고 가정했습니다. – Jason

+0

당신은 현재의 테이블 구조를 기반으로 뷰를 생성 할 수 있습니다.이 뷰에서는 모든 사용자 유형을 분리하고 여러 쿼리를 'UNION'과 결합 할 수 있습니다. 그런 다음 특정 유형 (예 :'WHERE type = 1')에 대한보기를 조회하십시오. 쿼리가 느리지 만 데이터 전송량이 가장 적습니다. – Alex

답변

1
SELECT * 
FROM privileges 
WHERE FIND_IN_SET(0, privilege) 
     AND FIND_IN_SET(1, privilege) 
를 만드는 등 그와 같은 단순한 사용자를 찾고, used_id 및 priviledge_id 관련된 많은 UserPriviledge 테이블에 많은 추가하려면 추가로 테이블을 생성 (테이블을 정상화하는 경우

당신은 더 빠른 쿼리를해야합니다 user_privileges은 권한 당 별도의 레코드가 있음). 이렇게하면 다음을 실행할 수 있습니다.

SELECT user 
FROM user_privileges 
WHERE privilege IN (0, 1) 
GROUP BY 
     user 
HAVING COUNT(*) = 2 

privilege에 대한 색인을 사용할 수 있습니다.

네이티브 SET 데이터 형식으로 권한을 저장하는 것도 고려해 볼 수 있습니다.

+0

권한 플래그가 9보다 큰 경우 어떻게됩니까? 'FIND_IN_SET (1, privilege)'는'2,3,10'이 있으면 무언가를 반환합니다. – Jason

+0

@ 제이슨 : 아니오, 그렇지 않습니다. 그냥'SELECT FIND_IN_SET (1, '2,3,10') '을 실행하십시오. – Quassnoi

+0

다른 테이블을 추가 할 수 없길 바랬습니다. 그러나 나는 다른 우아한 해결책이없는 것처럼 보인다. 빠른 질문, 사용자 데이터베이스를 질의했습니다. 행을 반환하기 전에 모든 권한을 다른 열에 추가하는 방법은 무엇입니까? 말이 돼? – Jason

3

ID와 이름이있는 Priviledge와 같은 테이블을 사용하지 않는 이유는 무엇입니까? 그리고 그렇게 다음 INNER_JOIN

1

테이블을 guiman이 제안한대로 정규화해야합니다. 위키피디아 당 : 정규화 된 테이블은 범용 쿼리에 적합합니다. 즉, 세부 사항을 예상 할 수없는 향후 쿼리를 포함하여 이러한 테이블에 대한 쿼리가 지원됩니다. 대조적으로, 정규화되지 않은 테이블은 일부 유형의 쿼리에는 적합하지만 다른 쿼리에는 적합하지 않습니다.

관련 문제