문제

데이터베이스 필드에 여러 날짜 값을 저장해야합니다. 이 값은 각 사용자가 이러한 여러 날짜 값의 고유 한 세트를 갖도록 "사용자"와 연결되어 있습니다.

여기서는 일대일 관계를 사용할 수 있지만 각 사용자는 정확히 4 개의 날짜 값이 묶여 있으므로 일대일 테이블이 과도하게 (예 : 속도) 과잉이지만 쿼리해야한다면 그들에 대해 나는 다른 필드에있는 4 가지 값이 필요합니다. 예를 들어 Mydate1 mydate2 .... 그러나 그것을 가져 오는 SQL 명령은 매번 4 값을 확인해야합니다.

그래서 일대일 관계는 아마도 최상의 솔루션 일 것이지만, 더 나은/더 깨끗한/더 빠른/다른 방법이 있습니까? 올바르게 디자인하고 있습니까?

이 플랫폼은 MS SQL 2005이지만 모든 플랫폼의 솔루션이 가능합니다. 저는 주로 적절한 DB 설계 기술을 찾고 있습니다.

편집하다: 4 개의 필드는 같은 4 가지 인스턴스를 나타냅니다.

도움이 되었습니까?

해결책

4 개의 별도 필드로 수행하면 가입 할 필요가 없습니다. 쿼리 구문을 너무 끔찍한 것으로 저장하려면 다음을 쓸 수 있습니다.

SELECT * FROM MyTable WHERE 'DateLiteral' IN (MyDate1, MyDate2, MyDate3, MyDate4);

의견에서 언급했듯이, IN 연산자는 날짜 필드 (마지막으로)와 관련하여 매우 구체적입니다 (Milli). 하위 퀘스트에서 언제든지 날짜 시간 함수를 사용할 수 있지만 그 사이는 사용할 수 없습니다.

SELECT * FROM MyTable WHERE date_trunc('hour', 'DateLiteral') 
IN (date_trunc('hour', MyDate1), date_trunc('hour', MyDate2), date_trunc('hour', MyDate3), date_trunc('hour', MyDate4));

다른 팁

일부 데이터베이스와 같은 데이터베이스 파이어 버드 배열 데이터 유형이있어 정확히 설명한 작업을 수행합니다. 다음과 같이 선언됩니다.

alter table t1 add MyDate[4] date;

가치가있는 것에 대해, 정규화 된 디자인은 날짜를 종속 테이블에 행으로 저장하는 것입니다.

단일 열에 여러 값을 저장하는 것은 정규화 된 설계가 아닙니다. 정규화는 명시 적으로 각 열에 정확히 하나의 값이 있음을 의미합니다.

이 방법으로 4 개 이상의 행이 종속 테이블에 삽입되지 않도록 할 수 있습니다.

 CREATE TABLE ThisManyDates (n INT PRIMARY KEY);
 INSERT INTO ThisManyDates VALUES (1), (2), (3), (4);

 CREATE TABLE UserDates (
   User_ID INT REFERENCES Users,
   n INT REFERENCES ThisManyDates,
   Date_Value DATE NOT NULL,
   PRIMARY KEY (User_ID, n)
 );

그러나이 디자인은 날짜 값을 의무적으로 만들 수 없습니다.

사용자 ID와 함께 4 개의 필드를 갖는 것은 어떻습니까 (확실하다면 그것을 초과하지 않을 것입니다)?

네 개의 날짜 필드를 만들고 필드에 날짜를 저장하십시오. 날짜 필드는 사용자 테이블의 일부일 수 있거나 다른 테이블이 일대일 관계에서 사용자 테이블에 합류 할 수 있습니다. 그것은 당신의 전화입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top