개체 타입과 개체 집합 문서의 검증 코드다. if __name__ == "__main__": 아래가 자체 테스트다.
"""개체 타입과 개체 집합 검증.
문서: 19.개체 타입과 개체 집합 (예시로 보기, 정의, 카드 C2)
출처: Elmasri & Navathe, Fundamentals of Database Systems 3장의 개체 예 (EMPLOYEE, COMPANY)
주장:
1. 개체 타입은 (이름, 속성 목록)이다. 개체 집합에 든 개체는 모두 그 속성마다 값을 하나씩 갖는다.
2. 개체를 넣거나 빼면 개체 집합은 바뀌지만 개체 타입은 그대로다.
3. 문서의 표: EMPLOYEE 개체 집합에 e1, e2, e3 세 개, COMPANY 개체 집합에 c1, c2 두 개가 보인다.
"""
# 개체 타입: 이름 -> 속성 목록 (문서의 표)
ENTITY_TYPES = {
"EMPLOYEE": ("Name", "Age", "Salary"),
"COMPANY": ("Name", "Headquarters", "President"),
}
# 개체 집합: 문서의 표에 보이는 개체들. 80k, 30K는 수로 옮겼다.
ENTITY_SETS = {
"EMPLOYEE": {
"e1": ("John Smith", 55, 80_000),
"e2": ("Fred Brown", 40, 30_000),
"e3": ("Judy Clark", 25, 20_000),
},
"COMPANY": {
"c1": ("Sunco Oil", "Houston", "John Smith"),
"c2": ("Fast Computer", "Dallas", "Bob King"),
},
}
def fits(entity_type, entity):
"""개체가 그 타입의 속성마다 값을 하나씩 갖는가."""
return len(entity) == len(ENTITY_TYPES[entity_type])
def main():
for name, entities in ENTITY_SETS.items():
assert all(fits(name, e) for e in entities.values())
assert len(ENTITY_SETS["EMPLOYEE"]) == 3 and len(ENTITY_SETS["COMPANY"]) == 2
print("[OK] 문서의 표: EMPLOYEE 3개, COMPANY 2개, 모든 개체가 타입의 속성 수와 맞는다")
# 개체를 넣어도 타입은 그대로다
type_before = dict(ENTITY_TYPES)
set_before = dict(ENTITY_SETS["EMPLOYEE"])
ENTITY_SETS["EMPLOYEE"]["e4"] = ("Kim Lee", 31, 45_000) # 문서의 예(보충)
assert ENTITY_TYPES == type_before
assert ENTITY_SETS["EMPLOYEE"] != set_before and len(ENTITY_SETS["EMPLOYEE"]) == 4
del ENTITY_SETS["EMPLOYEE"]["e2"]
assert ENTITY_TYPES == type_before and len(ENTITY_SETS["EMPLOYEE"]) == 3
print("[OK] 개체를 넣고 빼면 개체 집합만 바뀌고 개체 타입은 그대로다")
# 속성 수가 다른 것은 그 타입의 개체가 아니다
assert not fits("EMPLOYEE", ("Sunco Oil", "Houston"))
print("[OK] 속성이 맞지 않으면 그 타입의 개체가 아니다")
# 문서의 첫 표: e1의 Name과 c1의 President가 같은 값 'John Smith'다
assert ENTITY_SETS["EMPLOYEE"]["e1"][0] == ENTITY_SETS["COMPANY"]["c1"][2] == "John Smith"
print("[OK] 문서의 첫 표: e1의 Name과 c1의 President가 같은 값이다")
print("ALL CHECKS PASSED")
if __name__ == "__main__":
main()