문제

첫 번째 일반 양식은 행 주문이 중요하지 않다고 말합니다. 이것은 키의 일부로 날짜가있는 테이블이 1NF가 아니라는 것을 의미합니까? 예를 들어 날짜/시간이 PK의 일부인 티커 가격 테이블을 고려하십시오. 이 경우 날짜별로 데이터를 주문하고 상단 1 행을 선택하여 마지막 가격을 얻습니다. 이것은 1NF를 충족시키기 위해서는 테이블을 다음과 같이 나누어야한다는 것을 의미합니까?

도움이 되었습니까?

해결책

1NF a를 나타내는 테이블의 측면입니다 관계, 그와 같은 테이블이 아닙니다.

당신의 관계가 말하면 ticket HAS price, 그것은 a입니다 1NF 위반, a ticket HAS 또는 HAS NOT 그만큼 price 단일 레코드를 보면. 이 티켓의 모든 가격을 가져와 마지막으로 선택해야합니다. non-ordering rule1NF.

당신의 관계가 말하면 ticket HAD BEGUN TO COST price ON date, 그럼에는 안 돼요 1NF 각 레코드가 말하는 내용을 말하기 때문에 다음과 같습니다. 이것 ticket 소송 비용 이것 price ~에서 이것 date.

따라서 우리는이 테이블이 1NF 언제 대표 첫 번째 관계이지만 언제를 준수합니다 대표 두 번째.

물론 테이블 자체는 동일하게 유지됩니다.

테이블을 분할해야한다는 의미는 아닙니다.

요점의 요점 relational databases 당신이 사용할 수 있다는 것입니다 relational operators 한 관계를 다른 관계로 변환합니다.

무엇입니까 relation 측면에서 RDBMS? 테이블을 보여주는 테이블입니다 모두 의 조합 모두 이 관계에있는 가능한 가치.

예를 들어, 자연 수에 대한 평등 관계를 구성 해야하는 경우 1 에게 5, 우리는이 테이블을 가지고 있습니다.

1 1
2 2
3 3
4 4
5 5

이 표에 나타나는 모든 쌍은 평등 관계에 있습니다. 나타나지 않는 모든 쌍은 아닙니다. 우리는 보이지 않습니다 (2, 3) 여기, 또는 (4, 5), 그것들이 같지 않기 때문에.

그러나 전체 쌍을 데이터베이스에 보관할 필요는 없습니다. 대신 단일 값을 유지하고 쿼리를 작성합니다.

SELECT n1.number, n2.number
FROM number n1, number n2
WHERE n1.number = n2.number

, 그것은 당신에게 동일한 결과를 제공합니다.

실제로, 정상적인 형태는 당신을 유지할 수있게합니다 가장 간단하게 가능합니다 데이터베이스의 관계 테이블과 사용을 사용하여 더 복잡한 관계를 구성합니다. SQL 쿼리.

귀하의 경우, 다음과 같은 방식으로 쿼리 (또는보기 정의)를 작성하는 경우.

SELECT ticket, price
FROM mytable
WHERE (ticket, date) IN (
  SELECT ticket, MAX(date)
  FROM mytable
  GROUP BY
    ticket
  )

, 당신은 관계를 얻습니다 (ticket HAS price) 에서 (ticket HAD BEGUN TO COST price ON date) 데이터베이스에 전체 테이블을 유지하는 것처럼 정확히.

다른 팁

아니, "선택 ... 주문 ..."는 1NF를 위반하지 않습니다. 1NF를 위반하는 행 (및 열) 순서는 "XYZ에서 선택 *을 따라 선택한 다음 왼쪽에서 맨 위와 네 번째 열에서 세 번째 행을 선택하십시오"라는 줄에 관한 것입니다. 예, 나는 그런 DB 디자인을 보았습니다.

무엇을 의미하는지는 데이터의 일부 주문 (예 : 날짜별로)을 기록해야한다면 기록되어야한다는 것입니다. 명시 적으로, 예를 들어 날짜 열에서. 잘못된 것은 주문 만있는 것입니다. 절대적인 디스크의 행의 물리적 순서에서 (어쨌든 그것을 제어 할 수 있다고 가정). 다시 말해, 데이터를 순서대로 다시 가져 오려면 일부 열로 주문해야합니다.

아닙니다. 그것은 본질적인 순서가 없다는 것을 의미합니다. 마지막 가격의 날짜를 원한다면 select max(date) 당신의 테이블에서.

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