데이터베이스

여러가지 키

키는 속성 혹은 속성의 집합이 될 수 있다.

어떤 키를 이용하여 각각의 튜플을 특정해낼 수 있다면 그 키는 유일성을 만족한다.

  • 수퍼키(super key): 유일성을 만족하는 키
  • 후보키(candidate key): 최소한의 구성으로 유일성을 만족하는 키
  • 기본키(primary key): 후보키 중 기본으로 사용하고자 선택한 키
  • 대체키(alternative key): 기본키가 아닌 후보키
  • 외래키(foreign key): 다른 릴레이션을 참고할 때 사용하는 키

무결성과 제약조건

데이터베이스는 데이터의 무결성을 보장해야한다. 이를 위해 여러 제약조건을 걸고 지킨다.

자료마다 선정하는 무결성이 다른데 대체로 개체 무결성, 참조 무결성, 도메인 무결성은 무조건 고려하는 듯.

  • 개체 무결성: 개체가 존재하면 기본키로 구분할 수 있어야 한다.
  • 참조 무결성: 외래키는 유효한 PK이거나 NULL이어야한다.
  • 속성 무결성: 속성의 값이 타입과 맞아야 한다.
  • 키 무결성: 키는 반드시 하나의 튜플만을 가리켜야 한다.
  • 도메인 무결성: 해당 업무 도메인의 시선으로 보았을 때 올바라야 한다.

참조 무결성을 지키기 위하여 아래와 같은 제약조건을 걸 수 있다:

  • restrict(제한): 삭제할 수 없도록 한다.
  • cascade(다단계): 부모가 삭제되면 자식도 삭제한다.
  • nullify(널化): 부모가 삭제되면 자식의 참조값을 null로 바꾼다.
  • default(기본값): 부모가 삭제되면 미리 지정한 기본값으로 바꾼다.

예시

elixir의 ORM인 Ecto에서는 테이블 스키마를 서술할 때, references로 외래키를 명시하는데 이 때 참조 무결성에 대한 옵션을 줄 수 있다.

def up do
  create table("weather", prefix: "north_america") do
    add :city,    :string, size: 40
    add :temp_lo, :integer
    add :temp_hi, :integer
    add :prcp,    :float
    add :group_id, references(:groups, on_delete: :delete_all)
    #                                              ^
    #                               :nilify_all, :restrict, :delete_all과 같은
    #                               옵션을 쓸 수 있다.

    timestamps()
  end

  create index("weather", [:city], prefix: "north_america")
end

참고