[DB] 관계 schema로 축소

임승섭·2023년 4월 9일
0

Database system

목록 보기
3/22
post-custom-banner
  • Entity sets과 relationship sets은 데이터베이스의 내용물을 나타내는 relation schema로 균등하게(?)(uniformly) 표현될 수 있다.

  • E-R diagram을 따르는 데이터베이스는 schema들의 모음으로 표현될 수 있다.

  • 각각의 entity set과 relationship set의 이름에 할당되는 unique한 schema가 존재한다.

  • 각 schema는 unique한 이름이 있는 여러 개의 column이 있다. (일반적으로 attribute에 해당된다

Represent Entity Set

  • Strong Entity:
    A strong entity is not dependent on any other entity in the schema. A strong entity will always have a primary key. The relationship of two strong entities is represented by a single diamond.
  • Weak Entity:
    A weak entity is dependent on a strong entity to ensure its existence. Unlike a strong entity, a weak entity does not have any primary key. It instead has a partial discriminator key. The relation between one strong and one weak entity is represented by a double diamond. This relationship is also known as identifying relationship.
타이핑 편의를 위해, primary key를 표현하는 밑줄은 취소선으로 표현하겠다

strong entity set

  • strong entity set은 같은 속성을 갖는 schema로 축소된다.
  • student(ID, name, tot_cred)

weak entity set

  • weak entity set은 identifying strong entity의 primary key를 포함하는 column을 가진 table로 축소된다.

relation, schema, table 다 비슷하게 이해하면 될까?...

entity set with composite attribute

  • composite attribute들은 모두 같은 레벨의 attribute로 끄집어 내서 펼친다. 이때, 원래 attribute를 확인하기 위해 prefix를 써주기도 하는데, 굳이 사용하지 않아도 구분이 가능하면 생략한다.
  • name 안에 composite으로 first_name, middle_initial, last_name이 있었다면, 그냥 3개의 attribute name_first_name, name_middle_initial, name_last_name으로 써준다. 여기서 name이라는 prefix를 사용할 필요가 없다. 생략 가능.

entity set with multivalued, derived attribute

  • multivalued( {phone_number} )나 derived( age() )는 스키마에 반영하지 않는다
  • instructor(ID, first_name, middle_initial, last_name, street_number, street_name, apt_number, city, state, zip_code, date_of_birth)
  • 그럼 multivalued attribute는 어떡하냐?
  • 추가 schema(table)을 만든다 - inst_phone
  • M : multivalued attribue, E : entity
    EM : seperate schema
  • EM에는 E의 primary key와 M을 attribute으로 갖는다.
  • inst_phone = (ID, phone_number)
  • multivalued attribute의 값들은 EM의 각각 다른 tuple들에 mapping된다.
    instructor. ID = 22222, phone_number = 231-2323, 241-2394
    => (22222, 231-2323), (22222, 241-2394)

multivalued composite attribute

time_slot
time_slot_id
{
day
start_time
end_time
}
  • time_slot(time_slot_id)로 만드는 건 별 의미가 없는 table이다. 하지만 이걸 삭제하기에는 time_slot_id에 대한 foreign key를 다루기가 또 어려워진다. 하지만 어쨌든 없애는게 더 낫다(???) -> p266~267
  • time_slot_dse(time_slot_id, day, start_time, end_time) 으로 만든다
    처음 time_slot_id는 entity의 primary key.
    나머지 day, start_time, end_time은 multivalued attribute이다.
    모든 attribute이 primary key이다.

Representing Relationship Set

Many-to-many

  • many-to-many relationship set은 양 쪽 entity set의 primary key와, relationship set의 descriptive 속성을 속성으로 갖는다.
  • advisor(s_id, i_id)

Many-to-one / One-to-many

instructor
ID
name
salary

student
ID
name
tot_cred

department
dept_name
building
budget
  1. 'many' side가 total인 경우.
    (instructor = inst_dept -> department)
    (department <- stud_dept = student)
    모든 교사/학생은 학과가 있어야 한다
  • "one" side의 primary key를 "many" side의 속성으로 추가하여 표현한다
    굳이 inst_dept(ID, dept_name)을 만들 필요 없이,
    instructor(ID, name, salary, dept_name)으로 표현한다.
  • many-to-one이나 one-to-many에서는 "many" side의 primary key가 relationship의 primary key가 되므로, dept_name을 primary key로 쓸 필요가 없다. ( => 아 이건 다른 내용인 것 같다 )
  1. 'many' side가 partial인 경우
    (instructor <- advisor - student)
    지도교수가 없는 학생이 있을 수 있다.
  • partial을 무시하고 위 방법과 동일하게 진행하면,
    student(s_id, name, tot_cred, dept_name, i_id) 로 쓸 수 있다.
    여기서 dept_name은 위에서 department entity 때문에 생긴 것으로 볼 수 있고, "one" side의 primary key인 'i_id'를 "many" side의 속성으로 추가해 주었다.
    문제는, 현재 관계가 partial이기 때문에 i_id가 null일 수도 있기 때문이다. foreign key에 유배되는 건 아니지만, 기분이 좀 찜찜하다.
    그래서 advisor 스키마를 하나 추가로 만든다

  • advisor(i_id, s_id)
    역시 primary key는 'many' side의 것만 잡아준다.
    새로 만든 advisor에서 i_id가 null인지 체크한다. (null이면, 지도교수가 없다고 확인)
    student(s_id, name, tot_cred, dept_name)

one-to-one

  • one-to-one relationship set에서는, 양 쪽 모두가 "many" side 역할을 수행할 수 있다.
  • 지난 게시글에서도, one-to-one 관계의 primary key는 아무 entity의 primary key가 된다고 했었다.
  • 여기도 마찬가지로, partial인 경우에 위처럼 relationship set에 대해 새로운 schema를 생성할 수 있다.

relationship set linking weak entity set

  • weak entity set과 그것의 identifying strong entity를 연결하는 relationship set에 해당되는 schema는 중복된다(is redundant).
course
course_id
title
credits

section
sec_id (점선)
semester (점선)
year (점선)

(course <- sec_course = section)

  • 이 두 entity set 사이의 관계인 sec_course에 대한 schema를 만든다면,
    sec_course(course_id, sec_id, semester, year)로 만들 수 있지만,
    이건 이미 section entity에 대한 schema에 다 있는 정보이다.

  • 따라서 필요 없당

post-custom-banner

0개의 댓글