2014-11-24 2 views
0

사용자 계정과 함께 "이벤트"를 추적해야하며 전체 데이터베이스 테이블을 추가하지 않는 것이 좋습니다.컬렉션에 가장 적합한 데이터 유형

정수/정수 배열을 저장하는 데 가장 적합한 데이터 형식은 무엇입니까?

텍스트를 사용하여 배열로 값을 구문 분석 할 수 있다고 생각했지만보다 효과적인 방법이 있어야합니다.

{1,6,18,427,293}

는^나는이 비슷한 배열을 가정하지만 작을 수 있거나 더 이상 그냥 사용자에 따라 될 수 있습니다.

이것은 내가

사용자

Id | Name | Events 
0  James  {1,2} 
1  Kitty  {0} 
2  Mark  {1,3} 
3  Adam  {1,2,3} 

이벤트 그렇게 할 수있는 최선의 방법이 무엇인지

Id | Name | Location | Date 
0  Event 1  Here  Tommorow 
1  Event 2  There  Yesterday 
2  Event 3  Around Eventually 
3  Event 4  Near  Someday 

사용자의 이벤트 필드를 만들려고하고 무엇 기본적으로.

+3

'RDBMS'에 이와 같은 데이터를 저장하지 마십시오. 새 테이블을 만들면 길 아래로 많은 두통을 피할 수 있습니다 ... – sgeddes

+0

세 번째 레코드가 18 인 레코드를 조회하려면 어떻게됩니까? – ceejayoz

+0

두 개의 필드로 구성된 테이블을 가지고있는 것은 너무 어리석은 것처럼 보입니다. {AccountID, EventIndex} –

답변

1

이 첫 번째 정규 양식에 위배 : 그것은 비즈니스 SENS에 여러 값을 포함하고 있기 때문에

First normal form (1NF) is a property of a relation in a relational database. 
A relation is in first normal form if the domain of each attribute contains 
only atomic values, and the value of each attribute contains only a single 
value from that domain. 

귀하의 User.Events 열은 원자 없습니다.

여기서 해결 방법은 N : N 관계를 나타내는 고전적인 방법 인 junction table이라는 또 다른 테이블을 만드는 것입니다. 귀하의 예를 바탕으로

CREATE TABLE User_Event (
    UserId INTEGER NOT NULL REFERENCES User(Id), 
    EventId INTEGER NOT NULL REFERENCES Event(Id), 
    PRIMARY KEY (UserId, EventId) 
) 

,이 테이블의 값은 다음과 같습니다 :

UserId | EventId 
0   1 
0   2 
1   0 
2   1 
2   3 
3   1 
3   2 
3   3 

편집 : (일반적으로 이름 table1name_table2name는)

이 테이블에는 테이블 모두에 대한 참조를 포함 추가를 okiharaherbst의 의견 덕분에 접합부 테이블의 주요 키.

+0

완성을 위해, ('user_id, event_id)'쌍을 유일하게 색인화해야한다. –

관련 문제