{{위키데이터 속성 추적}}
{{출처 필요|날짜=2013-09-11}}
[[데이터 모델링]] 분야에서 '''개체-관계 모델'''이란 구조화된 데이터에 대한 일련의 표현이다.
[[파일:erd-entity-relationship-example1 kr.png|프레임|서로 관계된 두 개의 엔티티]]
"구조"화된 [[데이터]]를 저장하기 위해 [[데이터베이스]]를 쓴다. 이 데이터의 "구조" 및 그에 수반한 제약 조건들은 다양한 기법에 의해 설계될 수 있다. 그 기법 중 하나가 '''개체-관계 모델링'''(Entity-Relationship Modelling)이다. 줄여서 '''ERM'''이라고 한다. ERM 프로세스의 산출물을 가리켜 '''개체-관계 다이어그램'''(Entity-Relationship Diagram)이라 한다. 줄여서 '''ERD'''라 일컫는다. [[데이터 모델링]] 과정은 [[데이터 모델]]을 그림으로 표현하기 위해 [[표시법]]을 필요로 한다. ERD는 개념적 데이터 모델 혹은 시맨틱 데이터 모델의 한 타입이다.

== 사용처 ==

[[정보 시스템]]을 디자인 해나가는 데에 위와 같은 모델들을 사용하여 시스템이 필요로 하는 정보를 기술한다든가 [[데이터베이스]]에 저장되어야 할 [[정보]]의 타입(type)이 무엇인가 분석해 나갈 수 있다. 특히 [[요구사항 단계]]에서 말이다.

어떤 [[도메인 오브 디스코스]](관심 대상이 되는 부분)의 [[온톨로지]]를 기술할 때, [[데이터 모델링]] 테크닉이 사용될 수 있다. (사용된 텀들(terms)과 그들과의 관계를 정의하고 분류하는 일이다.) [[데이터베이스]]에 기반한 정보 시스템(information system)을 디자인하고자 하는 경우에는 나중에 가서는(논리 설계 단계) 개념 데이터 모델은 논리적 데이터 모델로 맵핑된다. 논리적 데이터 모델은 [[관계형 모델]] 같은 것이다; 뒤이어 논리적 데이터 모델은 물리 설계 단계에서 물리적 디자인 모델로 다시 맵핑된다. 단, 이와 같은 단계를 모두 뭉뚱그려 "물리 설계"라고 일컫기도 한다.

개체-관계 다이어그램(ERD)를 그리는 데에는 수많은 관습/방법(convention)이 존재한다. ERD를 그리는 데 아주 고전적인 방법이 이 문서의 아래에 기술되어 있다. 아래 기술된 방법은 개념 모델링과 주로 연관되어 있다.

데이터베이스 논리설계 및 물리설계 단계에서는 관습적으로 쓰이는 노테이션(notation)들이 몇 가지 더 있다. 예를 들면 [[인포메이션 엔지니어링]], [[IDEF|IDEF1X]] (ICAM DEFinition Language), [[디멘저널 모델링]] 같은 것들이다.

== 전통적인 다이어그램 컨벤션 ==
[[파일:Erd-entity-with-attribute.svg|프레임|애트리뷰트를 갖는 엔티티]]
[[파일:erd-relationship-with-attribute.png|프레임|애트리뷰트를 갖는 관계]]
[[파일:Erd-id-as-primary-key.png|프레임|[[기본 키]]]]
[[파일:ER Diagram MMORPG.png|섬네일|ER 다이어그램 예제]]

[[개체 (컴퓨팅)|개체]](엔티티)는 분리된 물체 하나를 표현한다. 엔티티는 [[명사 (품사)|명사]] 하나에 해당한다고 생각하면 쉽다. 예를 들면 다음과 같다: 컴퓨터(1개), 사람(1명), 악곡(1개), 수학적 정리(1개). 엔티티는 사각형으로 표시된다.

관계(릴레이션쉽)는 두 개 이상의 엔티티들이 어떻게 서로 연관되어 있나를 기록한다. 예를 들면 다음과 같다: 회사와 컴퓨터 사이의 "소유하다"라는 관계, 상사와 부하 직원 사이의 "감독하다"라는 관계, 연주자와 악곡 사이의 "연주"라는 관계, 수학자와 수학 정리 사이의 "증명했다"라는 관계 등이다. 관계는 다이아몬드형으로 그리는데, 관계된 엔티티와는 실선으로 연결한다.

<!--The model's linguistic aspect described above is utilized in the database [[query language]] [[ERROL]].-->

엔티티도 애트리뷰트를 가질 수 있고, 관계도 애트리뷰트를 가질 수 있다. 예를 들면 다음과 같다: employee인 엔티티는 [[생년월일]](SSN) 애트리뷰트를 가질 수 있다; "proved" 관계는 "날짜(date)" 애트리뷰트를 가질 수 있다. 애트리뷰트는 엔티티 집합이나 관계 집합에 선으로 연결시킨 타원형들로 그린다.

모든 엔티티([[위크 엔티티]]가 아닌 한)는 "고유하게 식별되는" 애트리뷰트 집합을 가지고 있어야 한다. 최소한의 고유 식별 애트리뷰트 집합은 엔티티의 [[기본 키]](Primary Key)라 불린다.

개체-관계 다이어그램은 하나의(single) 엔티티를 보여주고 있거나 하나의(single) 관계 인스턴스를 보여주고 있는 것은 아니다. 사각형은 "엔티티 집합들"을 나타내고 있는 것이고, 다이아몬드형은 "관계 집합들"을 보여주고 있는 것이다. 예를 들면 다음과 같다: 특정한 악곡은 하나의 엔티티이다. 하나의 데이터베이스 안의 모든 악곡들의 모음은 하나의 엔티티 집합이다. 한 아이와 그 아이의 점심 도시락 사이의 "먹어치움" 관계는 하나의(single) 관계이다. 하나의 데이터베이스 안의 모든 그러한 아이-점심 도시락 관계는 관계 집합이다.

실선은 관련된 엔티티 집합과 관계 집합 사이에 그린다. 엔티티 집합의 모든 엔티티가 관계에 참여(participate)하고 있을 때, 선을 굵게(thick) 그리거나 이중선(double)으로 그린다. 이것을 파티시페이션 콘스트레인트라고 부른다. 엔티티 집합 내의 각각의 엔티티가 관계 집합 내의 최대 한 개의 관계에 참여할 수 있을 때, 엔티티 집합에서 관계 집합 쪽으로 화살표를 하나 그려준다. 이것을 [[키 콘스트레인트]]라고 부른다. 엔티티 집합 내의 모든 엔티티가 각각 하나씩의 관계에 정확히 대응될 때는 화살표를 굵게(thick) 그린다.

다대다(many-to-many) 관계를 기술할 때는 [[어소시에이티브 엔티티]]를 사용할 수 있다.
[https://web.archive.org/web/20050907061628/http://infocom.cqu.edu.au/Courses/spr2000/95169/Extra_Examples/ERD.htm].

단일 테이블의 행 사이의 관계를 기술하기 위해 단방향 관계(Unary Relationships)를 사용할 수도 있다.

== 때때로 쓰이는 기호 ==

ER 모델링에서 어떤 기호들은 그렇게 자주 사용되지 않는다. 모델러들은 이러한 기호들을 종종 기피한다.

엔티티는 "스트롱(strong)" 엔티티일 수도 있고 "위크(weak)" 엔티티일 수도 있다.

* 상기 단락에서 기술한 보통의 엔티티를 가리켜 "스트롱 엔티티"라고 한다. 스트롱 엔티티는 엔티티가 가진 애트리뷰트들만 가지고 고유하게 정의될 수 있다.

* "[[위크 엔티티]]"는 엔티티가 가진 애트리뷰트들만 가지고 고유하게 정의될 수 없는 엔티티를 말한다. 따라서 한 개 이상의 관계를 엔티티의 프라이머리 키로 삼아야 한다. 위크 엔티티는 엔티티를 나타내는 사각형을 그리고, 관계를 나타내는 다이아몬드형을 그린 뒤, 그 둘을 굵은(bold) 선이나 이중(double)선으로 연결하여 표현한다. 예를 들면, 업무 추적(work tracking) 데이터베이스에서는, 한 태스크(task)는 태스크를 할당받은 사람(person)을 이용하여 식별된다. 이때 사람(person)은 엔티티이고, 태스크(task)는 위크 엔티티가 된다.

ER 모델링에서 애트리뷰트들은 다치(multi-valued) 애트리뷰트일 수도, 합성(composite) 애트리뷰트일 수도 혹은 종속(derived) 애트리뷰트일 수 도 있다:

* "다치 애트리뷰트"(multi-valued attribute)는 이중선(double line)으로 둘러싸인 타원으로표현된다. 적어도 한 개체의 인스턴스에 대해서 한 개 이상의 값을 가질 수 있는 애트리뷰트이다. 예를 들어, 소프트웨어(엔티티는 "애플리케이션")는 다치값의 "플랫폼" 애트리뷰트를 가질 수 있다. 애플리케이션의 인스턴스는 한 개 이상의 플랫폼 상에서 동작할 수 있기도 하기 때문이다.

* "합성 애트리뷰트"(composite attribute)는 두 개 이상의 애트리뷰트를 포함할 수 있는 애트리뷰트를 말한다. 자기 자신도 포함할 수도 있다. 예를 들면 주소는 번지, 도시 등등의 애트리뷰트들로 이루어진 합성 애트리뷰트라 할 수 있다.
* "추출 애트리뷰트"(derived attribute)는 그 값이 데이터베이스의 다른 정보에 의해 결정되는 애트리뷰트를 말한다; 종속 애트리뷰트는 점선으로 그린 타원형으로 표시한다. 예를 들면, 피고용인 데이터베이스가 있다고 가정할 때, "피고용인"의 "나이" 애트리뷰트는, "피고용인"의 "생년월일" 애트리뷰트로부터 추출/유도(derive)해낼 수 있다.

때때로 어떤 두 엔티티가 더 일반적인 분류의 엔티티의 하위 분류일 경우가 있을 수 있다. 예를 들면, 소프트웨어 기업의 피고용인 엔티티는 프로그래머 엔티티일 수 있고 마케터 엔티티일 수 있다. 위와 같은 경우, ISA라는 말을 안에 써 넣은 삼각형으로 표시한다. [[수퍼클래스]]는 위쪽에 그리고 다른 두 개(혹은 그 이상)의 [[서브클래스]]들은 밑변쪽(아래쪽)에 그린다.

어떤 한 개의 관계와 그것과 엮인 엔티티 집합들은 다시 단일 엔티티 집합으로 간주될 수 있다. 이것을 [[어그리게이션]]이라 하는데, 다른 관계와 엮을려는 목적이다. [[어그리게이션]]은 어그리게이트된 모든 개체와 관계를 둘러싼 점선 사각형으로 표시된다.

== 다른 다이어그램 컨벤션 ==
=== 크로우즈 핏 (까마귀 발) ===

[[파일:ERD-artist-performs-song.svg|프레임|크로우즈 핏 노테이션을 사용해 나타낸 두엔티티]]

크로우즈 풋/크로우즈 핏({{lang|en|Crow's Foot}}) 노테이션에서는, 엔티티 사이의 관계를 기본적으로 엔티티를 연결하는 선으로 나타낸다. 또한 관계의 [[카디널리티]]를 나타내는 기호들을 그 선의 양끝에 표시한다.

카디널리티를 나타내는 기호들은 다음과 같은 것들이 있다:

* "고리"(ring)은 "0"를 나타낸다.
* "실선"(dash)은 "1"을 나타낸다.
* "까마귀 발"(crow's foot)은 "다수" 혹은 "그 이상"을 나타낸다.

위와 같은 기호들은 서로 조합하여 사용될 수 있다. 다음과 같은 네 가지 조합이 가능하다.

* 고리와 실선 → 0 혹은 1
* 실선과 실선 → 정확히 1
* 고리와 까마귀 발 → 0개 이상
* 실선과 까마귀 발 → 1개 이상

크로우즈 핏(crow's feet) 노테이션의 예제는 오른쪽 그림을 참조하라.

오른쪽 그림에서, 우리는 다음과 같은 사실을 알 수 있다:
* 음악가(Artist)는 "0개 혹은 그 이상의" 노래(song)를 부른다.
* 노래 한 곡은 정확히 한 음악가(artist)에 의해 불린다. (주의: 실제 세계를 잘 반영하지 못하는 예제이다. 노래 한 곡을 듀엣으로 부를 수도 있는 것이다.)

크로우즈 핏 노테이션은 [[오라클 데이터베이스]] 텍스트에서 널리 쓰이고 있다. 또한 [[마이크로소프트 비지오]], [[파워디자이너]], [[다이어 (소프트웨어)]] 등의 틀에서 쓰이고 있다.

=== 장점 ===
* 크로우즈 핏 노테이션을 사용하면 다수(many) 관계를 표현하는 것이 명확해진다.
* 필수적인 관계가 있다면, 크루오즈 핏 노테이션은 그것을 표현하기 위한 간결한 노테이션이 된다. 이때는 수직선만 표시하면 된다. 또한 옵셔널한 관계가 있다면, 그것을 표현하기 위한 간결한 노테이션이 되는데, 이때에는 고리(open circle)로 표시하면 된다.

== ER 다이어그램 작성 툴 ==
=== 상용 ===
* [[마이크로디자이너]]: MicroDesigner, ERD 툴, IE 및 IDEF1X 표기법을 충실히 따르는 모델링 도구 제공, 공학/역공학 기능 및 모델 병합 기능등 다양한 기능을 제공 (주)인브레인 제작.
* [[eXERD]]: ERD 툴, 논리, 물리, 논리와 물리 통합 모델링을 지원. 메뉴 및 도움말이 한글로 제공되며 직관적이고 다양한 편의기능 제공. (주)토마토시스템 사 제작.
* [[CA ERwin Data Modeler]]: ERD 툴, HTML 리포트를 생성하는 기능이 있다.
* [[ConceptDraw]]: ER 다이어그램을 만들기 위한 크로스 플랫폼 소프트웨어있음
* [[DB Visual ARCHITECT]]: UML 클래스 다이어그램과 ERD를 지원한다.
* [[DA#]] : ERD툴, 데이터 모델링 기반의 비즈니스에 대한 획기적인 표현이 가능하다. [http://dataware.kr/solution/new_idx 솔루션다운로드] [https://web.archive.org/web/20200612071304/http://www.en-core.com/ (주)엔코아]
* [[ER/Studio]]: 강건하고, 사용하기 쉬운 ER 모델링 툴. Embarcadero사 제작.
* [[마이크로소프트 비지오]]: 엔터프라이즈 아키텍처 버전을 구입해야 여러 데이터베이스 및역 엔지니어링을 지원한다.
* [[ModelRight]]: 물리 모델링 툴.
* [[OmniGraffle]]: [[맥 OS]]용 다이어그램 그리기 소프트웨어
* [[Oracle Designer]]: [[오라클 코포레이션]]이 제공하는 [[컴퓨터-보조 소프트웨어 엔지니어링]] 툴. [[정보 시스템]] 설계 및 생성 툴.
* [[PowerDesigner]]: [[사이베이스]]에서 나온 모델링 스위트. 개념, 논리, 물리, 리버스 엔지니어링 모델링이 가능한 데이터 아키텍트(Data Architect) 툴 포함. 여러 [[RDBMS]] 브랜드를 지원한다.
* [[Rational Rose]]: UML 다이어그램을 작성하기 위한 소프트웨어이다. 오래된 만큼 사용하기도 쉽다.
* [[SILVERRUN]] 모델스피어: 개념, 논리, 물리 데이터 모델링을 지원. 다수의 타겟시스템을 지원하는 인터페이스가 갖춰져 있음.
* [[SmartDraw]]: 포인트 앤드 클릭(point and click) 그리기 기법을 제공. 여러 가지 템플레이트 제공.

=== [[무료 소프트웨어]] ===

* [[DBDesigner-Fork]]: DBDesigner의 변종. [[PostgreSQL]]과 같은 다른 데이터베이스 시스템도 이용할 수 있게 변형됨.
* [[다이어 (소프트웨어)]]: ERD 외에도 다른 여러 다이그램을 작성할 수 있는 툴.
* [[페렛 (소프트웨어)]]: [[데비안]], [[우분투 (운영 체제)|우분투]]와 같이 배포되는 ERM 툴.
* [[카이비오]]: (Kivio) ER 다이어그램도 지원하는 순서도 그리기 툴.
* [[MySQL 웍벤치]]: (MySQL WorkBench) 그래픽하게 스키마와 리버스 엔지니어링 스키마들을 작성할 수 있다. 여러 데이터베이스 엔진을 타겟으로 한다.
* [[오픈 시스템 아키텍트]]: (Open System Architect) ER 다이어그램 모델러. 가장 최근 버전은 2005년에 나온 것이다.
* [[파워*아키텍트]]: (POWER*ARCHITECT) [[자바 (프로그래밍 언어)|자바]] 언어로 작성된 ER 다이어그램 모델러. 여러 무료 소프트웨어 및 상용 데이터베이스 엔진을 타겟으로 한다.

== 같이 보기 ==
* [[데이터 모델]]
* [[통합 모델링 언어]] (''UML'')

== 각주 ==

* {{저널 인용
 |성          = Chen
 |이름       = Peter P.
 |저자링크 = 피터 첸
 |제목       = The Entity-Relationship Model - Toward a Unified View of Data
 |저널       = ACM Transactions on Database Systems
 |volume       = 1
 |issue        = 1
 |쪽          = 9-36
 |연도       = 1976
 |url          = http://csc.lsu.edu/news/erd.pdf
 |확인날짜 = 2012년 9월 15일
 |보존url    = https://web.archive.org/web/20120915192439/http://csc.lsu.edu/news/erd.pdf
 |보존날짜 = 2012년 9월 15일
 |url-status = dead
}}
[[피터 첸]]이 지은 이 논문은 컴퓨터 과학 분야에서 가장 많이 인용되는 논문이다. 1000여 명의 컴퓨터 과학과 교수 설문 결과 "가장 영향력 있는" 논문으로 꼽혔다. 인용 논문의 목록은 [[DBLP]]: http://dblp.uni-trier.de/ [http://dblp.uni-trier.de/] 등지에서 볼 수 있다.

== 외부 링크 ==
{{위키공용분류}}
* {{언어링크|en}} [http://rapidapplicationdevelopment.blogspot.com/2007/06/entity-relationship-diagram-example.html 개체 관계 다이어그램 예제] 크로우즈 핏 노테이션 데모.
* {{언어링크|en}} [https://web.archive.org/web/20070530180047/http://www.cilco.co.uk/briefing-studies/acme-fashion-supplies-feasibility-study/slides/logical-data-structure.html 케이스 스터디: 애크미 패션 서플라이즈를 위한 E-R 다이어그램] - 마크 H. 리들리(Mark H. Ridley) 제공.
* {{언어링크|en}} 노트: [http://www.cems.uwe.ac.uk/~tdrewry/lds.htm 논리적 데이터구조(LDSs) - 시작하기] - 토니 드류리(Tony Drewry) 제공
* {{언어링크|en}} [http://www2.cs.uregina.ca/~bernatja/crowsfoot.html Crow's Foot Notation] {{웨이백|url=http://www2.cs.uregina.ca/~bernatja/crowsfoot.html |date=20120305113434 }}
* [https://miro.com/ko/diagramming/what-is-an-er-diagram/ ER 다이어그램]

{{데이터베이스 모델}}
{{데이터 모델}}
{{소프트웨어 공학}}

{{전거 통제}}

[[분류:데이터 모델링]]
[[분류:다이어그램]]
[[분류:데이터베이스 모델]]
[[분류:데이터 모델링 언어]]
[[분류:모델링 언어]]