{{위키데이터 속성 추적}}
'''제1정규형(1NF 또는 최소형)'''은 [[데이터베이스 정규화]]에서 사용하는 정규형중 하나이다. [[관계형 데이터베이스]]의 [[테이블]]이 1NF이면 최소한 테이블은 [[관계 (데이터베이스)|관계]]<ref name="DateReln">"[T]he overriding requirement, to the effect that the table must directly and faithfully represent a relation, follows from the fact that 1NF was originally defined as a property of relations, not tables." Date, C. J. [http://www.dbdebunk.com/page/page/629796.htm "What First Normal Form Really Means"] in ''Date on Database: Writings 2000-2006'' (Springer-Verlag, 2006), p. 128.</ref>이며, '''중복되는 항목이 없어야 한다'''<ref name="Kent">"First normal form excludes variable repeating fields and groups." Kent, William. [http://www.bkent.net/Doc/simple5.htm "A Simple Guide to Five Normal Forms in Relational Database Theory"], ''Communications of the ACM'' '''26''' (2), Feb. 1983, pp. 120-125.</ref>이다.

"중복되는 항목이 없다"에 대한 정의는 학자마다 주장이 조금씩 달라서, 1NF를 만족하는 테이블에 대해서의 정확한 정의는 없다. 대부분의 학자들([[에드거 F. 커드]], Ramez Elmasri, Shamkant B. Navathe<ref name="Elmasri">Elmasri, Ramez and Navathe, Shamkant B. ''Fundamentals of Database Systems, Fourth Edition'' (Addison-Wesley, 2003), p. 315.</ref>)은 1NF를 만족하는 테이블은 관계 값을 가지는 항목(테이블 내 테이블)을 허용하지 않으나, 일부 학자들([[크리스토퍼 J. 데이트]] 등)은 이를 허용하기도 한다.

제1정규형은 다음 표준을 요구한다.
* 각 테이블에서 중복을 제거한다.
* 각각 관계된 데이터 모임을 위하여 분리된 테이블을 만든다.
* 각각 관계된 데이터 모임을 기본키로 식별한다.

== 관계를 의미하는 1NF 테이블 ==
[[크리스토퍼 J. 데이트]]에 의하면 테이블은 "어떤 관계와 동일 구조"이면 1NF이다. 이는 아래의 5가지 조건을 충족한다는 의미이다:

# 열에는 위-아래의 순서가 없다.
# 행에는 좌-우의 순서가 없다.
# 중복되는 열이 없다.
# 모든 열과 행의 중복지점에는 (열과 행의)해당되는 분야에서 한 개의 값을 가진다.
# 모든 행은 규칙적이다. [즉, 열은 열ID, 오브젝트ID, 숨어있는(hidden) 타임 스탬프등과 같은 숨어있는 요소(행)를 가지지 않는다.]
-- Chris Date, "What First Normal Form Really Means", pp.&nbsp;127–8<ref name="Date5Cr">Date, C. J. [http://www.dbdebunk.com/page/page/629796.htm "What First Normal Form Really Means"] pp. 127–128.</ref>

이런 조건을 충족하지 않는 테이블은 엄격히 보면 관계형이 아니라는 의미이며, 1NF가 아니다.

1NF의 정의를 충족하지 못하는 테이블(또는 [[뷰(데이터베이스)|뷰]])의 예제들을 보자면,

* [[유니크 키]]가 없다. 이런 테이블은 열의 중복을 허용하기 때문에, 3번 조건을 위배한다.
* 뷰의 결과가 특정한 순서를 가지게 정의한 뷰. 뷰의 측면에서 열의 정렬이 본질적이고 의미가 있을 경우.<ref name="ViewOrder">Such views cannot be created using [[SQL]] that conforms to the [[SQL:2003]] standard.</ref> 이는 1번 조건을 위배한다. 관계에서의 [[튜플]]은 서로간의 순서가 없다.
* 최소한 하나의 Null 속성을 가지는 테이블. Null 속성은 모든 행의 영역에서 꼭 한 개의 값만을 가져야 하는 4번 조건을 위배한다. 하지만 4번 조건은 논란이 많은데, [[에드거 F. 커드]]는 최근의 [[관계형 모델]]에 관한 견해에서 Null에 대한 명시적인 조항을 만들었었다.<ref name="DateNullsLater">"Codd first defined the relational model in 1969 and didn't introduce nulls until 1979" Date, C. J. ''SQL and Relational Theory'' (O'Reilly, 2009), Appendix A.2.</ref><ref name="CoddRule">The third of Codd's 12 rules states that "Null values ... [must be] supported in a fully relational DBMS for representing missing information and inapplicable information in a systematic way, independent of data type." Codd, E. F. "Is Your DBMS Really Relational?" ''Computerworld'', October 14, 1985.</ref>

== 중복되는 항목 ==
많은 사람들이 1NF를 정의하는 특성이라고 생각하는<ref name="DateRepg">Date, C. J. [http://www.dbdebunk.com/page/page/629796.htm "What First Normal Form Really Means"] p. 128.</ref> [[에드거 F. 커드]]의 4번째 조건은 중복되는 항목에 관한 조건이다. 아래의 시나리오들은 데이터베이스 디자인이 1NF를 위배하는 중복되는 항목을 가지는 경우이다.

=== 영역과 값 ===
초보 디자이너가 고객의 이름과 전화번호를 기록하고자 한다. 그는 아래와 같이 테이블을 정의하였다:

{| class="wikitable"
|+ Customer
!Customer ID !! First Name !! Surname !! Telephone Number
|-
|123
|Robert
|Ingram
|555-861-2025
|----
|456
|Jane
|Wright
|555-403-1659
|----
|789
|Maria
|Fernandez
|555-808-9633
|----
|}

디자이너는 이후에 어떤 고객들은 전화번호를 '''여러'''개 가지고 있다는 사실을 알게 되었다. 그는 아래와 같이 단순히 가장 간단한 방법을 생각하여 "전화번호"항목에 '''여러''' 개의 값을 두었다:

{| class="wikitable"
|+ Customer
!Customer ID !! First Name !! Surname !! Telephone Number
|-
|123
|Robert
|Ingram
|555-861-2025
|----
|456
|Jane
|Wright
|555-403-1659<br />555-776-4100
|----
|789
|Maria
|Fernandez
|555-808-9633
|----
|}

하지만 전화번호 행에는 전화번호가 아닌 전화번호와 유사한 도메인(12개의 길이를 가지는 문자열)이 정의되게 된다. 1NF(그 점에 있어서 [[관계형 데이터베이스]]도 마찬가지로)는 행 도메인에서 정확하게 한 개의 값만을 허용하기 때문에 위의 테이블은 1NF가 아니다.

=== 행을 가로지르며 중복되는 항목 ===
그래서 이 디자이너는 이번에는 이 제한을 충족하기 위해 여러개의 전화번호 행을 두었다:

{| class="wikitable"
|+ Customer
!Customer ID !! First Name !! Surname !! Tel. No. 1!! Tel. No. 2!! Tel. No. 3
|-
|123
|Robert
|Ingram
|555-861-2025
| 
| 
|----
|456
|Jane
|Wright
|555-403-1659
|555-776-4100
| 555-403-1659
|----
|789
|Maria
|Fernandez
|555-808-9633
| 
| 
|----
|}

하지만 이 디자인 역시 Null값을 가지는 행이 있기 때문에 [[크리스토퍼 J. 데이트]]의 1NF정의에 위배된다. 뷰가 Null 행을 허용하여도 이 디자인은 엄격히 보자면 1NF가 아니다. Tel. No. 1, Tel. No. 2., Tel. No. 3. 행은 완전히 동일한 도메인과 의미를 가진다. 위와 같이 전화번호 행을 3개로 인위적으로 나누게 된다면 아래와 같은 논리적인 문제들을 낳게 된다:

* 테이블 질의시 어려움. "어느 고객이 전화번호 '''X'''를 가지고 있는가?", "어떤 고객들끼리 같은 전화번호를 공유하는가?" 질의들은 답하기 어렵다.
* RDBMS에서 고객-전화번호의 유일성을 확보하기 어렵다. 고객 789가 실수로 Tel. No. 2값이 Tel. No. 1값과 동일한 값이 들어갈 수 있다.
* 전화번호 개수의 제한. 어떤 고객이 4개의 전화번호를 가진다면 4번째 전화번호는 기록될 수 없다.이는 데이터베이스 디자인이 비즈니스 프로세스를 제한하고 있다는 의미인데, 사실 이상적으로는 반대가 되어야 한다.

=== 행 내에서의 중복되는 항목 ===
그래서 이 디자이너는 이번에는 이 제한을 충족하기 위해 한개의 전화번호 행을 두면서 전화번호 행 길이를 여러개의 전화번호를 기록하기 충분한 길이로 변경하였다 :

{| class="wikitable"
|+ Customer
!Customer ID !! First Name !! Surname !! Telephone Numbers
|-
|123
|Robert
|Ingram
|555-861-2025
|----
|456
|Jane
|Wright
|555-403-1659, 555-776-4100
|----
|789
|Maria
|Fernandez
|555-808-9633
|----
|}

이 디자인은 1NF와 일치하지만, 디자인상의 문제점이 여러개 있다.전화번호는 의미상으로 모호해져서 전화번호를 표현할 수도, 전화번호들의 리스트를 표현할 수도, 심지어는 아무거나 표현할 수도 있다."어떤 고객들이 같은 전화번호를 공유하는가?" 질의는 답하기 더욱 어려워 졌으며, 전화번호와 전화번호들의 리스트를 수집해야 할 필요성이 생겼다. RDBMS 내에서 전화번호에 대한 의미적인 제한을 정의하는 것 또한 어려워 졌다.

=== 1NF를 충족하는 디자인 ===
1NF 측면에서 모호하지 않은 디자인은 2개의 테이블을 이용하는 것이다: 고객 명 테이블과 고객 전화번호 테이블이다.

{| class="wikitable" style="float:left"
|+ Customer Name
!Customer ID !! First Name !! Surname
|-
|123
|Robert
|Ingram
|----
|456
|Jane
|Wright
|----
|789
|Maria
|Fernandez
|----
|}
{| class="wikitable" style="float:left"
|+ Customer Telephone Number
!Customer ID !! Telephone Number
|-
|123
|555-861-2025
|----
|456
|555-403-1659
|----
|456
|555-776-4100
|---
|789
|555-808-9633
|----
|}
{{-}}

이 디자인에서는 전화번호들의 중복되는 항목은 나오지 않는다. 대신 고객 대 전화번호의 연결이 레코드에 나온다. 고객 ID가 키 항목으로, "부모-자식" 또는 "일대 다(1:M)" 관계가 2개의 테이블사이에 존재하게 되는데, 이는 ("부모" 테이블에 있는) 고객 열이 ("자식" 테이블에 있는) 전화번호 열을 여러개 가질 수 있기 때문이다. 참고로 이 디자인은 [[제 2 정규형]]과 [[제 3 정규형]]을 충족하기도 한다.

== 원자성(Atomicity) ==
[[에드거 F. 커드]]는 1NF의 정의에서 '''원자성'''에 대해서 언급하고 있다.[[에드거 F. 커드]]는 "관계가 정의된 도메인의 값은 DBMS에 대하여 원자성을 가져야 한다."<ref name="CoddAtmReq">Codd, E. F. ''The Relational Model for Database Management Version 2'' (Addison-Wesley, 1990).</ref> 고 하였다. [[에드거 F. 커드]]는 원자성을 갖는 값은 "(특수한 어떤 함수를 제외하고) DBMS에 의해서 더 작은 값으로 쪼개 지지 않는다"<ref name="CoddAtmDefn">Codd, E. F. ''The Relational Model for Database Management Version 2'' (Addison-Wesley, 1990), p. 6.</ref> 고 하였다. 이는 한 항목이 하나 이상의 [[자료형]]으로 나뉘면서 DBMS가 분리된 다른 부분에 대해서 의존적이지 않아야 한다는 의미이다.

[[허그 다윈]]과 [[크리스토퍼 J. 데이트]]는 [[에드거 F. 커드]]의 "원자성을 갖는 값"의 정의가 모호하며, 이런 모호성이 1NF를 이해하는데 크게 방해된다고 제안하였다.<ref name="Darwen">Darwen, Hugh. "Relation-Valued Attributes; or, Will the Real First Normal Form Please Stand Up?", in C. J. Date and Hugh Darwen, ''Relational Database Writings 1989-1991'' (Addison-Wesley, 1992).</ref><ref name="DateConf">"[F]or many years," writes Date, "I was as confused as anyone else. What's worse, I did my best (worst?) to spread that confusion through my writings, seminars, and other presentations." Date, C. J. [http://www.dbdebunk.com/page/page/629796.htm "What First Normal Form Really Means"] in ''Date on Database: Writings 2000-2006'' (Springer-Verlag, 2006), p. 108</ref> "값이 나뉘지 않아야 한다"라는 정의에 해당하는 데이터형이 아래와 같은 이유로 거의 존재하지 않기 때문에 문제가 많다:

* 문자열도 원자성이 없다. RDMS가 일반적으로 작은 문자열로 나눌 수 있는 연산자를 제공하기 때문이다.
* 고정 소수점 수자도 원자성이 없다. RDBS가 일반적으로 이를 정수와 나머지 부분으로 나눌 수 있는 연산자를 제공하기 때문이다.

[[크리스토퍼 J. 데이트]]는 "원자성이란 ''절대적인 정의가 없다''":<ref name="DateNoAtm">Date, C. J. [http://www.dbdebunk.com/page/page/629796.htm "What First Normal Form Really Means"] p. 112.</ref> 고 하였다. 값은 목적에 따라서 원자성을 가질 수 도 있으며, 다른 목적을 위해서 나뉠 수도 있다. 이런 의견을 받아들이면 1NF의 정의에 원자성은 관련이 없어진다. 임의의 편한 자료형(문자열, 숫자형, 배열, 테이블 등)으로 정의된 행이라도 1NF 테이블일 수 있지만, 항상 그런 것은 아니다(예를 들어서, 고객 이름을 성과 이름으로 나누어야 할 때가 있다.) [[크리스토퍼 J. 데이트]]는 심지어 관계 값을 갖는 속성, 즉 항목 안에 테이블이 있는 경우도 드문 경우에 유용하다고 하였다.<ref name="DateRVA">Date, C. J. [http://www.dbdebunk.com/page/page/629796.htm "What First Normal Form Really Means"] pp. 121–126.</ref>

== 1NF 이상의 정규화 ==
어떤 테이블이 [[제 2 정규형]](2NF)이거나 그 이상이면 정의에 따라서 1NF이기도 하다.(어떤 정규형이라도 그 이전 정규형의 충분조건이 된다.) 반대로 어떤 테이블이 1NF이면 2NF가 아닐수도 있다. 2NF이면 [[제 3 정규형]]일 수도 있고, 아닐 수도 있다.

1NF 이상의 정규형은 디자인 문제로 인하여 그 안의 데이터의 [[데이터 완전성|완전성]]을 절충해야 하는 상황을 고려하여야 한다. 예를 들어 아래의 테이블은 1NF이지만 2NF가 아니며, 이에 따라서 논리적 불일치에 있어서 취약하다:

{| class="wikitable"
|+ Subscriber Email Addresses
!Subscriber ID !! Email Address !! Subscriber First Name !! Subscriber Surname
|-
|108
|steve@aardvarkmail.net
|Steve
|Wallace
|----
|252
|carol@mongoosemail.org
|Carol
|Robertson
|----
|252
|crobertson@aardvarkmail.net
|Carol
|Robertson
|---
|360
|hclark@antelopemail.com
|Harriet
|Clark
|----
|}

이 테이블의 [[후보 키|키]]는 {Subscriber ID, Email Address}이다.

Carol Robertson이 결혼을 해서 성을 바꾼다면, 2개의 열을 변경하여야 한다. 1개의 열만 변경할 경우, 모순이 생긴다: "고객 252의 이름은 무엇인가?"에 대한 질문에 2개의 혼란스러운 답변이 생긴다. 2NF는 이 문제를 해결한다. Carol Robertson의 레코드는 그녀가 1개 이상의 이메일 주소를 사용함에 따라서 테이블에서 2개로 나타나는 것을 주목하기 바란다.

1NF 이상의 정규화에 대해서 생각해볼 수 있는 실질적인 방법은 레코드(행)들과 엔티티(테이블) 또는 속성(열)의 관계에 대해서 끊임없이 질문해 보는 것이다. 예를 들어, 이용자 레코드가 많은 이메일 주소 레코드와 관계가 있는가? 하나의 이메일 주소가 많은 이용자들과 관계가 있는가? 위의 테이블에서는 Carol Robertson이 하나 이상의 이메일 주소를 가지고 있었다. 하나의 이용자는 다수의 이메일 주소를 가질수 있고, 다수의 이메일 주소는 하나의 이용자를 가질수 있으므로 위의 테이블운 이용자와 이메일 주소간에 일대다(1:M) 관계가 있다고 답할 수 있다. 이제 ID, 성, 이름을 가지고 ID를 주 키로 하는 "이용자 테이블" 과 ID, 이메일을 가지고 ID를 주 키로 하는 "이용자 이메일 테이블"이라는 두 테이블이 있다면 ID를 주 키로 하는 "이용자 테이블" 과 ID를 [[외래 키]]로 하는 "이용자 이메일 테이블" 간에 1대 다 관계가 생기며, 이 테이블들도 1NF이게 된다.

== 참고 자료 ==
* [[데이터베이스 정규화]]
* [[제2정규형]]
* [[제3정규형]]
* [[보이스-코드 정규형]]

== 인용 자료 ==
{{각주|2}}

== 더 읽을거리 ==
* [http://www.troubleshooters.com/littstip/ltnorm.html Litt's Tips: Normalization]
* [https://web.archive.org/web/20080805014412/http://www.datamodel.org/NormalizationRules.html Rules Of Data Normalization]
* Date, C. J., & Lorentzos, N., & Darwen, H. (2002). ''[http://www.elsevier.com/wps/product/cws_home/680662 Temporal Data & the Relational Model] {{웹아카이브|url=https://archive.today/20121209052842/http://www.elsevier.com/wps/product/cws_home/680662 |날짜=2012-12-09 }}'' (1st ed.). Morgan Kaufmann. {{ISBN|1-55860-855-9}}.
* Date, C. J. (1999), ''[https://web.archive.org/web/20050404010227/http://www.aw-bc.com/catalog/academic/product/0,1144,0321197844,00.html An Introduction to Database Systems]'' (8th ed.). Addison-Wesley Longman. {{ISBN|0-321-19784-4}}.
* Kent, W. (1983) ''[http://www.bkent.net/Doc/simple5.htm A Simple Guide to Five Normal Forms in Relational Database Theory]'', Communications of the ACM, vol. 26, pp.&nbsp;120–125
* Date, C. J., & Darwen, H., & Pascal, F. ''[http://www.dbdebunk.com Database Debunkings]''

== 외부 링크 ==
* [http://databases.about.com/od/specificproducts/a/normalization.htm Database Normalization Basics] {{웨이백|url=http://databases.about.com/od/specificproducts/a/normalization.htm |date=20070205184226 }} by Mike Chapple (About.com)
* [https://web.archive.org/web/20110606025027/http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html An Introduction to Database Normalization] by Mike Hillyer.
* [https://web.archive.org/web/20100106115112/http://www.utexas.edu/its/archive/windows/database/datamodeling/rm/rm7.html Normalization] by ITS, University of Texas.
* [https://web.archive.org/web/20080805014412/http://www.datamodel.org/NormalizationRules.html Rules of Data Normalization] by Data Model.org
* [https://web.archive.org/web/20110715075109/http://phlonx.com/resources/nf3/ A tutorial on the first 3 normal forms] by Fred Coulson
* [http://support.microsoft.com/kb/283878 Description of the database normalization basics] by Microsoft

{{전거 통제}}

[[분류:데이터베이스]]
[[분류:데이터 모델링]]
[[분류:데이터베이스 정규화]]
[[분류:관계대수]]