2008-10-16 5 views
11

전자 메일을 통해 사이트의 활동을 사용자에게 알리는 웹 기반 응용 프로그램이 있습니다. 사용자는 수신 할 통지 유형을 선택할 수 있습니다. 지금까지 약 10 가지 옵션이 있습니다 (각각은 참/거짓입니다).데이터베이스에 여러 플래그를 저장하는 가장 좋은 방법

저는 현재 이것을 하나의 varchar 필드에 0 또는 1로 쉼표로 구분하여 저장하고 있습니다. 예 : 1,00011100

이 기능은 작동하지만 새로운 알림 플래그를 추가하고 어떤 플래그가 어떤 알림에 속하는지 추적하는 것은 어렵습니다. 이 작업을 수행 할 수있는 표준이 있습니까? 각 알림 유형마다 다른 표를 추가하려고 생각했습니다. 필요한 경우 새 열을 추가 할 수 있지만 이것이 얼마나 효율적인 지 잘 모르겠습니다.

미리 감사드립니다.

답변

20

두 테이블을 사용합니다. 하나의 테이블은 사용자 데이터와 사용자가 구독하는 다른 알림을 저장합니다. 두 번째 표는 다음과 같이 보일 것입니다 :

create table notifications (
    user_id int, 
    notification_type int 
); 

내가 USER_ID 및 삭제에 캐스케이드 사용자 테이블에서 사용자의 ID 사이에 FK 관계를 만들 것입니다. user_id와 notification_type을 기본 키로 사용하십시오. 사용자가 특정 통지를 원하는지 확인하려면 단순히 두 테이블 간의 조인을 수행하고 notification_type이 해당 테이블과 일치하는 행을 선택하십시오. 결과 세트가 공백이 아닌 경우, 사용자는 통지를 원합니다.

새 알림을 추가하는 작업이 사소한 작업 (삭제 작업과 마찬가지로)이됩니다. 새 유형 값을 추가 (삭제)하고 사용자가 승인하도록 선택하십시오. 응용 프로그램을 통해 관리 할 테이블의 알림 유형을 계속 유지하려면 너무 복잡하지만 좀 더 복잡합니다.

+0

이것은 지금까지 가장 좋은 해결책으로 보입니다. 하나의 열에 이들 모두를 저장하는 것은 확장 성이 없습니다. 테이블에 bool 필드로 저장하면 새로운 알림 유형이있을 때마다 새 필드를 추가해야합니다. – Craig

+0

이 기능은 특히 통지 유형을 검사 할 수있게하려는 경우에 유용합니다. – BCS

+0

정규화는 확장성에는 뛰어나지 만 성능면에서는 약간의 어려움이 있습니다. – stephenbayer

0

DB를 Bool 열을 사용하여 관리하게하는 것이 더 좋을 것이라고 기대합니다. 나는 몇몇 시스템이 bool을 비트 (null은 엉망이 될 수도 있음)로 압축 할 것임을 상기 한 것 같다. 혼란을 피하기 위해 별도의 테이블로 만들 수 있습니다. 때려은 머리 "난 그냥 당신의 일이 정확히 무엇을 제안했다":

편집 (나는 더 DBA는 아니지만)

2

나는 10 개 개의 서로 다른 비트 또는 부울 필드를 사용할 것 나. 그러나 하나의 필드에서 작업을 수행하려는 경우 비트 맵 0x1111111111을 쉼표없이 큰 정수 또는 텍스트 필드로 사용할 수 있습니다. 나는 모든 기술을 사용하여 여러 응용 프로그램에서 작업했습니다. 하지만 실제로는 여러 필드로 이동합니다. select 문을 사용하는 것이 훨씬 쉬울 것입니다.

0

@stephenbayer와 같은 비트 필드를 사용하기로 결정했다면 개발자가 쉽게 사용할 수 있도록 테이블의보기를 사용할 수 있습니다. 비트 필드 및 필드 당 별도의 열의 사용 용이성과 열을 구문 분석하지 않아도됩니다.

위에서 설명한대로 솔루션을 확장하기 쉽게하려면 별도의 표를 사용하는 것이 좋습니다.유일한 단점은 약간 복잡성이 증가한다는 것입니다.

이것은 상쇄 관계에 있습니다. 당신이 구현하기 쉽고 빠르게 원하는 것을 원한다면 비트 필드를 고려하십시오. 약간의 복잡성을 감수하면서 확장하고 유지하기가 더 쉬운 것을 원하면 별도의 테이블을 찾으십시오. 투표가 여러분에게 무엇인가를 말하면 별도의 테이블 구현을 따르기를 원할 것입니다.

관련 문제