2011-10-31 2 views
0

관리자가 모듈을 구입하여 사용자에게 할당 할 수있는 작은 데이터베이스를 만들고 있습니다. 또한 관리자는 모듈에서 사용자를 할당 해제하고 (해당 라이센스를 폐기) 모듈에 다른 사용자를 재 할당 할 수 있습니다. 또한 이러한 변경 사항이 얼마나 자주 발생하는지 확인하기 위해 이러한 과제를 기록하고 싶습니다.
User_Licenses(user_license_id, user_id, module_id, date_from, date_to)
DATE_TO 활성 사용자를위한 빈 남아 :데이터베이스 디자인 및 SQL 문 속도

내 하나의 옵션은 유형의 하나 개의 테이블을하는 것입니다.

User_Licenses(user_license_id, user_id, module_id, active_user_log_id) 
Active_User_Log(active_user_log_id, date_from, date_to) 

:

SELECT user_id FROM User_Licenses 
WHERE user_id = 1 
AND module_id = 1 
AND date_from <= TODAY 
AND date_to = NIL 

내 다른 옵션은 타입 2 개 테이블을 가지고있다 : 이것은 사용자가 해당 모듈에 대한 액세스 권한이 있는지 확인하기 위해 내가 확인해야 할 것이다 것을 의미한다 새 라이센스가 할당 될 때마다 로그 항목을 만들고 라이센스가 할당되지 않을 때마다 date_to 필드를 업데이트합니다.

지금은 할 그들은 사용자가 난 단지 알고있는 모듈에 대한 액세스 권한이 있는지 확인하기 위해 아직, 두 번째 옵션에 좀 더 프로그래밍 오버 헤드, 본질적으로 같은 것입니다 한 이해 :

SELECT user_id FROM User_Licenses 
WHERE user_id = 1 
AND module_id = 1 

로그는 논리적으로 "일상 점검"과 분리되어 있습니다.


제가 알고 싶습니다. 가장 많이 사용되는 것은 무엇이며, 첫 번째 SQL 문은 두 번째 것보다 훨씬 느립니다.

이것은 웹 응용 프로그램을위한 것으로, 사용자 수가 100을 넘지 않을 가능성이 높으며 모듈에 대한 사용자 할당 변경이 최소화되어야합니다. 모듈에 대한 액세스 확인은 매일 이루어지며 사용자는 여러 모듈에 할당됩니다.

미리 도움을 주셔서 감사합니다.

답변

0

제 의견을 말씀 드리지만 더 많은 질문과 우선 해결해야 할 주제가 있습니다.

첫 번째 사례를 사용하는 경우 시작하려면 '활성 사용자'의 개념이 그다지 중요하지 않다고 말하는 것입니다. 두 번째 경우에, 당신은 그것이 그렇다고 말하고 있습니다. 즉, 여기에서는 한 가지 종류의 쿼리에 대해서만 이야기하고 있지만 다른 쿼리에 대한 요구가 있으며 사용자가 결정하는 데 도움이되는 "활성 사용자"를 처리하는 경우에도 필요합니다.

또한 null을 비교하는 코드를 작성할 때 "date_to = nil"대신 "date_to is null"이라고 말해야합니다. 데이터베이스는 종종 (거의 항상?) NULL과 공백을 구분하며, 한 가지 방법은 열을 null과 비교하는 방법입니다.

필자는 Licensing에 대한 경험을 토대로 특정 시간 동안 무언가를 라이센스한다고 생각합니다. 따라서 하나의 테이블 메소드는 NULL을 지표로 사용하므로 나에게 호소력이 없습니다. 차라리 데이트를보고, 현재 날짜가 만료 날짜 이후인지 물어볼 수 있습니다. 이 문제는 결정적인 것이 아니지만 언급하는 것이 합리적이라고 생각했습니다.

마지막으로 Active_User_Log 테이블은 비명 소리를냅니다. USER 테이블도 가지고 있습니까? 나는 User 테이블로 갔을 것이고, USER.STATUS와 같은 테이블에 상태를 추가했다. 당신은 여전히 ​​라이선스 테이블에 가입해야하지만, 내 생각에 테이블은 현실을 조금 더 잘 반영 할 것입니다.

내 대답은 무엇입니까? 기본 테이블을 적절하게 색인화하는 한 두 쿼리 간의 속도 차이는 눈에 띄지 않습니다. 그러나 두 테이블 접근 방법에 대해 투표하고 해당 엔티티에 특정한 단일 테이블의 내용을 유지합니다.

+0

활성 사용자는 두 경우 모두 내게 중요합니다. 처음 사용자에게 암시되었습니다. User_Log는 각 사용자가 다양한 모듈에 대한 라이센스를 모듈 단위로 갖기 때문에 거기에 있으며 (모듈 단위로) 한 달 동안 모듈을 필요로하지 않으면 그는 그 모듈을 "놓아"다시 구입할 수 있습니다 그 다음 달. 라이센스가 공유되지 않도록 로그가 필요합니다. 제안에 관해서는 속도가 중요한 요소가 아니기 때문에 필자는 엔티티 고유의 테이블 내용을 유지하기를 원하기 때문에 2 테이블 접근 방식이 더 좋다고 생각합니다. 조언 주셔서 감사 : D 조 –

관련 문제