{{위키데이터 속성 추적}}
'''커드의 12 규칙'''({{lang|en|Codd's 12 rules}})이란 어떤 [[데이터베이스]]가 "관계형 데이터베이스"라고 여겨지기 위한 조건을 나열한 13가지의 규칙을 말한다. [[데이터베이스]]를 위한 [[관계형 모델]]의 개척자인 [[에드거 F. 커드|에드거 커드]]({{lang|en|Edgar F. Codd}}) 박사가 제안한 규칙 모음이다.<ref>Codd, Edgar Frank: "Is Your DBMS Really Relational?", ''ComputerWorld'', 14. October 1985</ref><ref>Codd, Edgar Frank: "Does Your DBMS Run By the Rules?", ''ComputerWorld'', 21. October 1985</ref>

1980년대 초반 데이터베이스 개발사들은 종래의 데이터베이스를 살짝 고쳐 "관계형"이라는 허식 하에 데이터베이스를 판매하곤 하였는데, 에드가 커드는 이로 인해 관계형 데이터베이스에 대한 그의 비전이 변질되는 것을 막는 개인 캠페인의 일환으로 이 규칙들을 제정하였다. 특히 12번째 규칙은 데이터베이스 개발사들의 그러한 포지셔닝을 반대하기 위해 제정되었다. 사실, 커드의 12 규칙은 매우 엄격한 것이어서, 대중적으로 인기있는 소위 "관계형" DBMS들은커드의 12 규칙이 정하는 여러 기준 항목들을 통과 못한다.

== 규칙 ==
'''규칙 0:''' 시스템은 "[[데이터베이스]]" 뿐만 아니라 "[[관리 시스템]]"으로써도 "[[관계형 모델]]" 자격을 얻어야 한다.
: 어떤 시스템이 관계형 데이터베이스 매니지먼트 시스템(RDBMS)으로서의 자격을 얻고자 한다면, 그 시스템은 그 시스템의 "관계형" 수단(만)을 "[[데이터베이스]]"를 "관리"하는 데 사용하여야 한다.

'''규칙 1:''' "정보 규칙":
:데이터베이스 내의 모든 정보는 한 가지 방법으로만 표현되어야 한다. 즉 테이블 내 행 안의 열 안에 들어간 값으로 표현되어야 한다.

'''규칙 2:''' "보장된 접근 규칙":
:모든 데이터는 모호함이 없이 접근되어야 한다. 이 규칙은 "기본 키"(primary keys)가 요구된다는 말을 다르게 표현한 것이다. 데이터베이스 내의 모든 개별적인 스칼라 값은, 그것을 포함하는 [[테이블 (데이터베이스)|테이블]]의 이름, 열의 이름 그리고 [[행]]의 [[기본 키]]를 지정하면, 논리적으로 어드레스로 불러낼 수 있어야(addressable) 한다고 언급하고 있다.

'''규칙 3:''' "널 값의 체계적인 처리"
:DBMS는 각 필드에 대해 "널(null)" 값을 갖게 할 수 있어야 한다. (다른 말로 비어 있게 할 수 있어야 한다는 말이다.) 특히, DBMS는 "정보가 없거나 활용할 수 없는 정보임"이라는 것에 대한 표현을 지원하되, [[체계적]]이고, 다른 모든 통상적인 값들과는 구별되게 할 수 있어야 한다. (예를 들어, 수에 대해 "0이나 그 이외의 수들과는 구별됨"이라는 표현) "정보가 없거나 활용할 수 없는 정보임"이라는 것에 대한 표현은 [[자료형|데이터 타입]]도 독립적이여야 한다. 이 규칙은 DBMS 내에서는 그러한 표현들이 체계적인 방법으로 다루어져야 한다는 것을 암시한다.

'''규칙 4:''' "관계형 모델에 기반한 액티브 [[온라인과 오프라인|온라인]] [[데이터베이스 카탈로그]]":
:시스템은 온라인, 인라인 [[관계형 카탈로그]]를 지원해야 한다. 이 [[관계형 카탈로그]]는 접근 허용된 사용자들에게 통상의 [[쿼리 언어]]를 통해 접근 가능하여야 한다. 다시 말해, 사용자들은 데이터베이스의 데이터를 접근하는 때 쓰는 것과 동일한 [[쿼리 언어]]를 이용하여 데이터베이스의 구조(카탈로그)를 접근할 수 있어야 한다.

'''규칙 5:''' "종합적인 데이터 보조언어 규칙"
:시스템은 적어도 하나의 관계형 언어를 지원하되, 그 관계형 언어는 다음의 특징을 가져야 한다.
::(가) [[선형 문법]]을 가진다.
::(나) 대화형(interactively)으로 이용될 수도 있고, 애플리케이션 프로그램 안에서 이용될 수 있다.
::(다) 데이터 정의 동작({{lang|en|data definition operations}})을 지원해야 한다. (뷰(view)에 대한 정의도 할 수 있어야 한다.) 데이터 조작 동작({{lang|en|data manipulation operations}})를 지원해야 한다. 보안과 무결성 제약조건 그리고 [[트랜잭션]] 관리 동작(비긴, 커밋, 롤백)을 지원해야 한다.

'''규칙 6:''' "뷰 갱신 규칙"
:이론적으로 갱신 가능한 모든 뷰(views)는 시스템에 의해서 갱신 가능하여야 한다.

'''규칙 7:''' "고급 삽입, 갱신, 제거":
:시스템은 집합에 대해 한 번에(set-at-a-time) "삽입", "갱신", "제거" 동작을 지원해야 한다. 데이터베이스에서 여러 개의 행 또는 여러 개의 테이블에서 나온 데이터로 생성한 집합 내에서 다시 데이터를 획득할 수 있어야 한다는 말이다. 다시 말해, 이 규칙은 한 개의 테이블이나 한 개의 행에서 "삽입", "갱신", "제거" 동작이 행해지는 것이 아니라 여러 개의 테이블이나 여러 개의 행에서 그러한 동작이 행해져야 한다는 말이다.

'''규칙 8:''' "물리적 데이터 독립성":
:물리적 레벨에서(데이터가 어떻게 저장되든지, 배열에 저장되든지 링크드 리스트에 저장되든지) 변경이 일어났더라도, 그 구조에 기반한 애플리케이션은 변경되어선 안 된다.

'''규칙 9:''' "논리적 데이터 독립성":
:논리적 레벨에서(테이블, 열, 행,...) 변경이 일어났더라도, 그 구조에 기반한 애플리케이션은 변경되어선 안 된다. 논리적 데이터 독립성은 물리적 데이터 독립성보다 달성하기 어렵다.

'''규칙 10:''' "무결성 독립성":
:[[무결성 제약조건]]들은 [[데이터베이스 카탈로그]]에 저장되어야 하며 애플리케이션 프로그램들과는 별도로 규정되어야 한다. 기존의 애플리케이션에 영향을 주지 않고 [[무결성 제약조건]]들을 변경하는 것이 가능해야 한다.

'''규칙 11:''' "분산 독립성":
:여러 장소에 대한 데이터베이스의 분산 문제는 데이터베이스의 사용자에게 영향을 주지 않아야 한다. 다음과 같은 상황 하에서도, 기존의 동작하던 애플리케이션들은 계속 그대로 동작해야 한다:
::(가) 분산을 지원하는 DBMS가 처음 도입될 때, 그리고
::(나) 기존의 분산된 데이터가 시스템에 다시 재배치되어 분산될 때.

'''규칙 12:''' "무전복 규칙"
:만약 시스템이 "저급"(record-at-a-time) 인터페이스를 제공한다면, 그 인터페이스는 시스템을 파괴하는 데 쓰여서는 안 된다. 예를 들어 관계형 "보안"/"무결성" 제약 등을 파괴하는 데 쓰여서는 안 된다.

== 같이 보기 ==
* [[IBM 시스템 R]]
== 각주 ==
<small>{{각주}}</small>

{{전거 통제}}

[[분류:데이터 모델링]]
[[분류:사람 이름을 딴 낱말]]
[[분류:명수 12]]
[[분류:데이터베이스 이론]]
[[분류:관계형 모델]]