├── .gitignore ├── .vscode └── settings.json ├── course ├── Module01_overview_database │ ├── contents │ │ ├── 00_introduction.adoc │ │ ├── 01-1_chapter1_introduction_to_database_system.adoc │ │ ├── 01-2_data_and_information.adoc │ │ ├── 01-3_information_system.adoc │ │ ├── 01-4_database.adoc │ │ ├── 01-5_database_management_system.adoc │ │ ├── 01-6_function_dbms.adoc │ │ ├── 02-10_advantage_of_dbms.adoc │ │ ├── 02-1_chapter2_dbms.adoc │ │ ├── 02-2_filesystem_n_db.adoc │ │ ├── 02-3_dataspec_n_store.adoc │ │ ├── 02-4_data_model.adoc │ │ ├── 02-5_data_independency.adoc │ │ ├── 02-6_database_query.adoc │ │ ├── 02-7_concurrency.adoc │ │ ├── 02-8_transaction.adoc │ │ ├── 02-9_dbms_architecture.adoc │ │ ├── 02-lab01.adoc │ │ └── 99_review.adoc │ ├── images │ │ ├── image01.png │ │ ├── image02.png │ │ ├── image03.png │ │ ├── image04.png │ │ ├── image05.png │ │ ├── image06.png │ │ ├── image07.png │ │ ├── image08.png │ │ ├── image09.png │ │ ├── image10.png │ │ ├── image11.png │ │ ├── image12.png │ │ ├── image13.png │ │ ├── image14.png │ │ ├── image15.png │ │ ├── image16.png │ │ ├── image17.png │ │ ├── image18.png │ │ ├── image19.png │ │ ├── image20.png │ │ ├── image21.png │ │ └── image22.png │ └── readme.adoc ├── Module02_relational_model │ ├── Readme.adoc │ ├── code │ │ └── 01_creation_query_mysql.sql │ ├── contents │ │ ├── 00_introduction.adoc │ │ ├── 01-1_chapter1_introduction_to_relational_model.adoc │ │ ├── 01-2_introduction_to_relational_model.adoc │ │ ├── 01-3_12_laws.adoc │ │ ├── 01-4_history01.adoc │ │ ├── 01-5_history02.adoc │ │ ├── 01-6_history03.adoc │ │ ├── 02-1_chapter2_relation.adoc │ │ ├── 02-2_relation_schema.adoc │ │ ├── 02-3_relation_instance.adoc │ │ ├── 02-4_domain.adoc │ │ ├── 02-5_relational_database.adoc │ │ ├── 02-lab2-1a.adoc │ │ ├── 02-lab2-1b.adoc │ │ ├── 02-lab2-1c.adoc │ │ ├── 02-lab2-1d.adoc │ │ ├── 03-1_chapter3_integrity_constraint.adoc │ │ ├── 03-2_introduction_to_ic.adoc │ │ ├── 03-3_entity_integrity.adoc │ │ ├── 03-4_referential_integrity.adoc │ │ ├── 03-5_domain_integrity.adoc │ │ ├── 03-6_enforce_ic.adoc │ │ ├── 04-1_chapter4_query.adoc │ │ ├── 04-2_introduction_to_query.adoc │ │ ├── 04-3_sql.adoc │ │ ├── 04-Lab2-2a.adoc │ │ ├── 04-Lab2-2b.adoc │ │ ├── 04-Lab2-2c.adoc │ │ ├── 04-Lab2-2d.adoc │ │ └── 99_review.adoc │ └── images │ │ ├── image01.png │ │ ├── image02.png │ │ ├── image03.png │ │ ├── image04.png │ │ ├── image05.png │ │ ├── image06.png │ │ ├── image07.png │ │ ├── image08.png │ │ ├── image09.png │ │ ├── image10.png │ │ ├── image11.png │ │ ├── image12.png │ │ ├── image13.png │ │ ├── image14.png │ │ ├── image15.png │ │ ├── image16.png │ │ ├── image17.png │ │ ├── image18.png │ │ ├── image19.png │ │ ├── image20.png │ │ ├── image21.png │ │ ├── image22.png │ │ ├── image23.png │ │ ├── image24.png │ │ ├── image25.png │ │ ├── image26.png │ │ ├── image27.png │ │ ├── image28.png │ │ ├── image29.png │ │ ├── image3.png │ │ ├── image30.png │ │ ├── image31.png │ │ ├── image32.png │ │ ├── image33.png │ │ ├── image34.png │ │ ├── image35.png │ │ ├── image36.png │ │ ├── image37.png │ │ ├── image38.png │ │ ├── image39.png │ │ ├── image40.png │ │ ├── image41.png │ │ ├── image42.png │ │ └── image43.png ├── Module03_disk_and_file │ ├── Readme.adoc │ ├── code │ │ ├── Table_creation_MSSQL.sql │ │ ├── Table_creation_MySQL.sql │ │ └── Table_creation_PostgreSQL.sql │ ├── contents │ │ ├── 00_introduction.adoc │ │ ├── 01-1_chapter1_memory_hi.adoc │ │ ├── 01-2_overview_disk_and_file.adoc │ │ ├── 01-3_storage_hire.adoc │ │ ├── 02-1_chapter2_disk.adoc │ │ ├── 02-2_hdd.adoc │ │ ├── 02-3_ssd.adoc │ │ ├── 02-4_performance_storage.adoc │ │ ├── 03-1_chapter3_disk_space_mgt.adoc │ │ ├── 03-2_block.adoc │ │ ├── 03-3_disk_space.adoc │ │ ├── 04-1_chapter4_buffer_manager.adoc │ │ ├── 04-2_buffer_pool.adoc │ │ ├── 04-3_buffer_paging.adoc │ │ ├── 04-4_buffer_management.adoc │ │ ├── 05-1_chapter5_record.adoc │ │ ├── 05-2_fixed_length_record.adoc │ │ ├── 05-3_variant_length_record.adoc │ │ ├── 06-1_chapter6_page.adoc │ │ ├── 06-2_page_type.adoc │ │ ├── 06-3_fixed_record.adoc │ │ ├── 06-4_variant_record.adoc │ │ ├── 07-1_chapter7_file_index.adoc │ │ ├── 07-2_heap.adoc │ │ ├── 07-3_index.adoc │ │ ├── 07-4_isam.adoc │ │ ├── 07-5_bplus_tree.adoc │ │ ├── 08-1_chapter8_system_cat.adoc │ │ ├── 08-2_system_catalog.adoc │ │ ├── 08-lab3a.adoc │ │ ├── 08-lab3b.adoc │ │ ├── 08-lab3c.adoc │ │ ├── 08-lab3d.adoc │ │ └── 99_review.adoc │ └── images │ │ ├── image01.png │ │ ├── image02.png │ │ ├── image03.png │ │ ├── image04.png │ │ ├── image05.png │ │ ├── image06.png │ │ ├── image07.png │ │ ├── image08.png │ │ ├── image09.png │ │ ├── image10.png │ │ ├── image11.png │ │ ├── image12.png │ │ ├── image13.png │ │ ├── image14.png │ │ ├── image15.png │ │ ├── image16.png │ │ ├── image17.png │ │ ├── image18.png │ │ ├── image19.png │ │ ├── image20.png │ │ ├── image21.png │ │ ├── image22.png │ │ ├── image23.png │ │ └── image24.png ├── Module04_file_and_index │ ├── contents │ │ ├── 00_file_and_index.adoc │ │ ├── 01-1_chapter1_cost_file.adoc │ │ ├── 01-2_cost_model.adoc │ │ ├── 01-3_file_org.adoc │ │ ├── 01-4_heap_file.adoc │ │ ├── 01-5_sorted_file.adoc │ │ ├── 01-6_hash_file.adoc │ │ ├── 01-7_file_choice.adoc │ │ ├── 02-1_chapter2_index.adoc │ │ ├── 02-2_index_overview.adoc │ │ ├── 02-3_clustered_index.adoc │ │ ├── 02-4_nonclustered_index.adoc │ │ ├── 02-5_sparse_index.adoc │ │ ├── 02-6_primary_index.adoc │ │ ├── 02-7_composite_index.adoc │ │ ├── 02-lab4a.adoc │ │ ├── 02-lab4b.adoc │ │ ├── 02-lab4c.adoc │ │ ├── 02-lab4d.adoc │ │ └── 99_review.adoc │ ├── images │ │ ├── image01.png │ │ ├── image02.png │ │ ├── image03.png │ │ ├── image04.png │ │ ├── image05.png │ │ ├── image06.png │ │ ├── image07.png │ │ ├── image08.png │ │ ├── image09.png │ │ ├── image10.png │ │ ├── image11.png │ │ ├── image12.png │ │ ├── image18.png │ │ ├── image19.png │ │ ├── image20.png │ │ ├── image21.png │ │ ├── image22.png │ │ ├── image23.png │ │ ├── image24.png │ │ ├── image25.png │ │ └── image26.png │ └── readme.adoc ├── Module05_algebra_calcurus │ ├── contents │ │ ├── 00_algebra_calcurus.adoc │ │ ├── 01-1_chapter1_algebra.adoc │ │ ├── 01-2_algebra_overview.adoc │ │ ├── 01-3_selection_projection.adoc │ │ ├── 01-4_set_operation.adoc │ │ ├── 01-5_row.adoc │ │ ├── 01-6_join.adoc │ │ ├── 01-7_quiz.adoc │ │ ├── 02-1_chapter2_calcurus.adoc │ │ ├── 02-2_tuple.adoc │ │ ├── 02-3_quiz.adoc │ │ ├── 02-4_domain.adoc │ │ └── 02-5_quiz.adoc │ ├── images │ │ └── image01.png │ └── readme.adoc ├── Module06_sql │ ├── code │ │ ├── Table Creation_MSSQL.sql │ │ ├── Table Creation_mysql.sql │ │ ├── Table_Creation_Oracle.adoc │ │ └── Table_Creation_PostgreSQL.sql │ ├── contents │ │ ├── 00_introduction.adoc │ │ ├── 01-1_chapter1_introduction_to_sql.adoc │ │ ├── 01-2_introduction_to_sql.adoc │ │ ├── 01-3_sql_org.adoc │ │ ├── 02-1_chapter2_ddl.adoc │ │ ├── 02-2_ddl.adoc │ │ ├── 02-3_ddl_in_sql.adoc │ │ ├── 02-4_create_alter_drop.adoc │ │ ├── 02-lab6-1a.adoc │ │ ├── 02-lab6-1b.adoc │ │ ├── 02-lab6-1c.adoc │ │ ├── 02-lab6-1d.adoc │ │ ├── 03-1_chapter3_dml.adoc │ │ ├── 03-2_note.adoc │ │ ├── 03-3_sql_query_type.adoc │ │ ├── 03-4_select_clause.adoc │ │ ├── 03-5_expression_n_string_in_sql.adoc │ │ ├── 03-6_from_clause.adoc │ │ ├── 03-7_where_clause.adoc │ │ ├── 04-1_chapter4_set_operation.adoc │ │ ├── 04-2_union.adoc │ │ ├── 04-3_intersect.adoc │ │ ├── 04-4_except.adoc │ │ ├── 05-1_chapter5_subquery.adoc │ │ ├── 05-2_introduction_2_subquery.adoc │ │ ├── 05-3_nested_subquery.adoc │ │ ├── 05-4_inlineview.adoc │ │ ├── 05-5_scalar_subquery.adoc │ │ ├── 05-6_correlated_subquery.adoc │ │ ├── 06-1_chapter6_aggregate_calculation.adoc │ │ ├── 06-2_aggregate_function.adoc │ │ ├── 06-3_groupby_n_having.adoc │ │ ├── 07-1_chapter7_order.adoc │ │ ├── 07-2_orderby.adoc │ │ ├── 07-3_order_by_index.adoc │ │ ├── 08-1_chapter8_insert.adoc │ │ ├── 08-2_insert_clause.adoc │ │ ├── 08-3_insert2.adoc │ │ ├── 08-4_sql92_standard.adoc │ │ ├── 09-1_chapter9_update.adoc │ │ ├── 09-2_update_clause.adoc │ │ ├── 09-3_sql92_standard.adoc │ │ ├── 10-1_chapter10_delete.adoc │ │ ├── 10-2_delete_clause.adoc │ │ ├── 10-3_sql92.adoc │ │ └── 99_review.adoc │ ├── homework │ │ ├── answer_MYSQL.adoc │ │ ├── answer_mssql.adoc │ │ └── queryexam.adoc │ ├── images │ │ ├── image01.png │ │ ├── image02.png │ │ ├── image03.png │ │ ├── image04.png │ │ ├── image05.png │ │ ├── image06.png │ │ ├── image07.png │ │ ├── image08.png │ │ ├── image09.png │ │ ├── image10.png │ │ ├── image11.png │ │ ├── image12.png │ │ ├── image13.png │ │ ├── image14.png │ │ ├── image15.png │ │ ├── image16.png │ │ ├── image17.png │ │ ├── image18.png │ │ ├── image19.png │ │ ├── image20.png │ │ ├── image21.png │ │ ├── image22.png │ │ └── image23.png │ └── readme.adoc ├── Module07_security_view │ ├── contents │ │ ├── 00_security_view.adoc │ │ ├── 01-1_chapter1_security.adoc │ │ ├── 01-2_overview_security.adoc │ │ ├── 01-3_user_object.adoc │ │ ├── 01-4_access_control.adoc │ │ ├── 01-5_dac.adoc │ │ ├── 01-6_privilege.adoc │ │ ├── 01-7_nece.adoc │ │ ├── 01-lab7a.adoc │ │ ├── 01-lab7b.adoc │ │ ├── 01-lab7c.adoc │ │ ├── 01-lab7d.adoc │ │ ├── 02-1_chapter2_view.adoc │ │ ├── 02-2_overview_view.adoc │ │ ├── 02-3_view_creation.adoc │ │ ├── 02-4_view_update.adoc │ │ └── 02-lab7-2a.adoc │ ├── images │ │ ├── image01.png │ │ ├── image02.png │ │ └── image03.png │ └── readme.adoc ├── Module08_sp_function_trigger │ ├── code │ │ ├── Table_creation_MSSQL.sql │ │ ├── Table_creation_MySQL.sql │ │ └── Table_creation_postgres.sql │ ├── contents │ │ ├── 00_introduction.adoc │ │ ├── 01-1_chapter1_sql_routine.adoc │ │ ├── 01-2_introduction_routine.adoc │ │ ├── 01-3_create_routine.adoc │ │ ├── 01-4_parameter.adoc │ │ ├── 01-5_call_routine.adoc │ │ ├── 01-6_return.adoc │ │ ├── 01-7_modify_routine.adoc │ │ ├── 01-lab8-1a.adoc │ │ ├── 01-lab8-1b.adoc │ │ ├── 01-lab8-1c.adoc │ │ └── 01-lab8-1d.adoc │ └── readme.adoc ├── Module09_persistant_stored_module │ ├── Readme.adoc │ ├── code │ │ ├── mssql_function.sql │ │ ├── mssql_stored_procedure.sql │ │ ├── mysql_function.sql │ │ └── mysql_stored_procedure.sql │ ├── contents │ │ ├── 01_introduction.adoc │ │ ├── 02_psm.adoc │ │ ├── 04_introduction_psm.adoc │ │ ├── 04_stored_procedure.adoc │ │ ├── 04_variables.adoc │ │ ├── 05_flow_control.adoc │ │ ├── 05_introduction_stored_procedure.adoc │ │ └── loop_statement.adoc │ └── images │ │ ├── image01.png │ │ ├── image02.png │ │ ├── image03.png │ │ ├── image04.png │ │ ├── image05.png │ │ ├── image06.png │ │ ├── image07.png │ │ └── image08.png ├── Module10_er_model │ ├── contents │ │ ├── 00_introduction.adoc │ │ ├── 01-1_chapter1_design_overview.adoc │ │ ├── 01-2_design_overview.adoc │ │ ├── 01-3_requirement_analysis.adoc │ │ ├── 01-4_conceptual_design.adoc │ │ ├── 01-5_logical_design.adoc │ │ ├── 01-6_schema_refine.adoc │ │ ├── 01-7_physical_design.adoc │ │ ├── 02-1_chapter2_ER_model.adoc │ │ ├── 02-2_er_model.adoc │ │ ├── 02-3_entity_attribute_entityset.adoc │ │ ├── 02-4_relation_relationshipset.adoc │ │ ├── 03-1_chapter3_er_model_function.adoc │ │ ├── 03-2_mapping_cadinality.adoc │ │ ├── 03-3_key_constraint.adoc │ │ ├── 03-4_participation_constraint.adoc │ │ ├── 03-5_weakly_entityset.adoc │ │ ├── 03-6_specialization.adoc │ │ ├── 04-1_chapter4_conceptural_design.adoc │ │ ├── 04-2_cd_using_er_model.adoc │ │ ├── 04-3_entity_or_attribute.adoc │ │ ├── 04-4_entity_or_relationship.adoc │ │ ├── 04-5_binary_or_triage.adoc │ │ └── 99_review.adoc │ ├── images │ │ ├── image01.png │ │ ├── image02.png │ │ ├── image03.png │ │ ├── image04.png │ │ ├── image05.png │ │ ├── image06.png │ │ ├── image07.png │ │ ├── image08.png │ │ ├── image09.png │ │ ├── image10.png │ │ ├── image11.png │ │ ├── image12.png │ │ ├── image13.png │ │ ├── image14.png │ │ └── image15.png │ └── readme.adoc ├── Module11_schema_refine_and_normal_form │ ├── contents │ │ ├── 00_schema_refine.adoc │ │ ├── 01-1_chapter1_introduction_to_schema_refine.adoc │ │ ├── 01-2_introduction_to_schema_refine.adoc │ │ ├── 01-3_decomposition.adoc │ │ ├── 01-4_functional_dependency.adoc │ │ ├── 01-5_schema_refine.adoc │ │ ├── 01-6_functional_dependency.adoc │ │ ├── 02-1_chapter2_normalization_and_nf.adoc │ │ ├── 02-2_normalization.adoc │ │ ├── 02-3_1nf.adoc │ │ ├── 02-4_2nf.adoc │ │ ├── 02-5_3nf.adoc │ │ ├── 02-6_bcnf.adoc │ │ ├── 03-1_chapter3_decomposition.adoc │ │ ├── 03-2_overview_decomposition.adoc │ │ ├── 03-3_join_decomp.adoc │ │ ├── 03-4_dependency_decomp.adoc │ │ ├── 03-5_BCNF.adoc │ │ └── 99_review.adoc │ ├── homework │ │ └── homework.adoc │ ├── images │ │ ├── image01.png │ │ ├── image02.png │ │ ├── image03.png │ │ ├── image04.png │ │ └── image05.png │ └── readme.adoc ├── Module13_concurrency_control │ ├── contents │ │ ├── 00_concurrency_control.adoc │ │ ├── 01-1_chapter1_transaction.adoc │ │ ├── 01-2_introduction_to_transaction.adoc │ │ ├── 01-3_transaction_consistency.adoc │ │ ├── 01-4_transaction_and_schedule.adoc │ │ ├── 01-lab12-1a.adoc │ │ ├── 01-lab12-1b.adoc │ │ ├── 01-lab12-1c.adoc │ │ ├── 01-lab12-1d.adoc │ │ ├── 02-1_chapter2_consistency.adoc │ │ ├── 02-2_serializable.adoc │ │ ├── 02-3_cross_operation.adoc │ │ ├── 02-4_wr_collision.adoc │ │ ├── 02-5_serialized_transaction.adoc │ │ ├── 02-6_wr_collision.adoc │ │ ├── 02-7_RW_collision.adoc │ │ ├── 02-8_rw_collision.adoc │ │ ├── 02-9_ww_collision.adoc │ │ ├── 03-1_chapter3_lock.adoc │ │ ├── 03-2_lock_mode.adoc │ │ ├── 03-3_shared_lock_mode.adoc │ │ ├── 03-4_exclusive_lock_mode.adoc │ │ ├── 03-5_strict_2_phase_lock.adoc │ │ ├── 04-1_chapter4_concurrency_control.adoc │ │ ├── 04-2_control_lock.adoc │ │ ├── 04-3_deadlock.adoc │ │ ├── 04-4_deadlock_prevention.adoc │ │ ├── 04-5_deadlock_detection.adoc │ │ ├── 04-lab12-2a.adoc │ │ ├── 04-lab12-2b.adoc │ │ ├── 04-lab12-2c.adoc │ │ ├── 04-lab12-2d.adoc │ │ ├── 05-1_chapter5_special_lock.adoc │ │ ├── 05-2_phantom_problem.adoc │ │ ├── 05-3_another_lock.adoc │ │ ├── 06-1_chapter6_transaction_support_on_sql.adoc │ │ ├── 06-2_characteristic_of_transaction.adoc │ │ ├── 06-3_isolation_level.adoc │ │ ├── 06-4_isolation_level.adoc │ │ ├── 06-5_isolation_level.adoc │ │ ├── 06-lab12-3a.adoc │ │ ├── 06-lab12-3b.adoc │ │ ├── 06-lab12-3c.adoc │ │ └── 06-lab12-3d.adoc │ ├── images │ │ ├── image01.png │ │ ├── image02.png │ │ ├── image03.png │ │ ├── image04.png │ │ ├── image05.png │ │ ├── image06.png │ │ ├── image07.png │ │ ├── image08.png │ │ ├── image09.png │ │ ├── image10.png │ │ ├── image11.png │ │ ├── image12.png │ │ ├── image13.png │ │ ├── image14.png │ │ ├── image15.png │ │ ├── image16.png │ │ ├── image17.png │ │ ├── image18.png │ │ ├── image19.png │ │ ├── image20.png │ │ ├── image21.png │ │ ├── image22.png │ │ ├── image23.png │ │ ├── image24.png │ │ ├── image25.png │ │ ├── image26.png │ │ ├── image27.png │ │ ├── image28.png │ │ ├── image29.png │ │ ├── image30.png │ │ ├── image31.png │ │ ├── image32.png │ │ ├── image33.png │ │ ├── image34.png │ │ ├── image35.png │ │ ├── image36.png │ │ ├── image37.png │ │ ├── image38.png │ │ ├── image39.png │ │ ├── image40.png │ │ ├── image41.png │ │ ├── image42.png │ │ ├── image43.png │ │ └── image44.png │ └── readme.adoc ├── n1_appendix_setup_dbms │ └── readme.adoc └── test │ ├── Test.adoc │ └── image │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 13.png │ ├── 33.png │ ├── 35.png │ ├── 40.png │ └── 7.png └── readme.adoc /.gitignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .DS_Store 3 | .vscode/ -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /course/Module01_overview_database/contents/00_introduction.adoc: -------------------------------------------------------------------------------- 1 | = Module 01: 데이터베이스 개요 2 | 3 | 데이터베이스 관리 시스템은 서로 관계 있는 데이터들의 모임과 그 데이터에 접근하기 위한 프로그램의 집합으로 구성됩니다. 데이터베이스는 보통 이 데이터들의 모임을 일컫는 말로서, 흔히 조직과 관련된 정보들을 포함합니다. 이 장에서는 데이터베이스 시스템의 기본 원칙에 대해 간략히 설명합니다. 4 | 5 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 6 | 7 | * 정보(Information)과 데이터(Data)에 대해 이해하고 이를 조직하는 시스템에 대해 이해합니다. 8 | * 데이터베이스 관리 시스템과 데이터를 관리하기 위해 해야 하는 일들을 설명합니다. 9 | 10 | == Table of contents 11 | 12 | . link:./01-1_chapter1_introduction_to_database_system.adoc[데이터베이스 시스템 개요] 13 | . link:./02-1_chapter2_dbms.adoc[데이터베이스 관리 시스템 개요] 14 | 15 | --- 16 | 17 | link:./01-1_chapter1_introduction_to_database_system.adoc[다음: 데이터베이스 시스템 개요] -------------------------------------------------------------------------------- /course/Module01_overview_database/contents/01-1_chapter1_introduction_to_database_system.adoc: -------------------------------------------------------------------------------- 1 | = 데이터베이스 시스템 개요 2 | 3 | 데이터베이스는 하나 또는 하나 이상의 조직과 관련된 데이터의 집합체이며, 데이터베이스 관리 시스템은 데이터의 방대한 집합체를 유지관리하고 이용하는데 도움을 주도록 설계된 소프트웨어를 말합니다. 이 장에서는 데이터베이스와 데이터베이스 관리 시스템에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./01-2_data_and_information.adoc[정보와 데이터] 8 | 2. link:./01-3_information_system.adoc[정보 시스템] 9 | 3. link:./01-4_database.adoc[데이터베이스] 10 | 4. link:./01-5_database_management_system.adoc[데이터베이스 관리 시스템] 11 | 5. link:./01-6_function_dbms.adoc[데이터베이스 관리 시스템의 기능] 12 | 13 | --- 14 | 15 | link:./00_introduction.adoc[이전: 데이터베이스 시스템 개요] + 16 | link:./01-2_data_and_information.adoc[다음: 데이터와 정보] -------------------------------------------------------------------------------- /course/Module01_overview_database/contents/01-2_data_and_information.adoc: -------------------------------------------------------------------------------- 1 | = 데이터와 정보 2 | 3 | * 데이터(Data) + 4 | 현실 세계로부터 단순한 관찰이나 측정을 통해서 수집된 사실(fact)이나 값(Value) 5 | * 정보(Information) + 6 | 어떤 상황에 대한 적절한 의사 결정을 할 수 있게 하는 지식(Knowldege)으로서 유효한 데[이터의 해석 또는 데이터간의 관계 7 | * 정보(Information)는 데이터(Data)를 처리해서 얻어진 결과 + 8 | `I = P(D)` 9 | * 데이터에서 정보를 추출하는 방법을 데이터 처리(Data Processing), 넓은 의미로 정보 처리(Information Processing)라고 함 10 | 11 | --- 12 | 13 | 데이터(Data)는 현실 세계로부터 단순한 관찰이나 측정을 통해서 수집된 사실(facts)이나 값(value)을 말합니다. 이 값은 숫자로 표현되는 수치는 물론이고 어떤 문자들로 표현되는 수치는 물론이고 어떤 문자들로 표현되는 문자열(String)로 포함됩니다. 14 | 15 | 정보(Information)란 어떤 상황에 대한 적절한 의사 결정을 할 수 있게 하는 지식(Knowledge)으로서 데이터의 유효한 해석이나 데이터 상호간의 관계를 말합니다. 정보는 데이터를 처리해서 얻을 수 있는 결과입니다. 이를 수식으로 아래와 같이 표현할 수 있습니다. 16 | 17 | `I = P(D)` 18 | 19 | image:../images/image01.png[] 20 | 21 | 데이터 자체가 내포하고 있는 정보를 추출하는 방법은 아주 중요하며, 그런 방법이 없이 단순히 수집되어 정보가 되기 힘든 데이터는 쓰임새가 많지 않습니다. 정보 추출 방법을 자료 처리(Data Processing) 또는 정보 처리(Information Processing)라고 합니다. 22 | 정보가 유용성을 갖기 위해서는 정확성과 현재성을 가지고 있어야 합니다. 또한 필요할 때는 언제든 이용될 수 있도록 수집, 조직, 저장되어 있어야 합니다. 통상적으로 정보와 데이터가 혼용되는 이유가 바로 이러한 정보와 데이터간의 표리 관계 때문입니다. 23 | 24 | --- 25 | 26 | link:./01-1_chapter1_introduction_to_database_system.adoc[이전: 데이터베이스 시스템 개요] + 27 | link:./01-3_information_system.adoc[다음: 정보 시스템] -------------------------------------------------------------------------------- /course/Module01_overview_database/contents/01-5_database_management_system.adoc: -------------------------------------------------------------------------------- 1 | = 데이터베이스 관리 시스템 2 | 3 | * DBMS(Database Management System) 4 | * 데이터의 방대한 집합체를 유지 관리하고 이용하는데 도움을 주도록 설계된 소프트웨어 5 | * 데이터의 종속성과 중복성의 문제를 해결하기 위해 제안된 시스템 6 | 7 | image:../images/image02.png[] 8 | 9 | --- 10 | 11 | **데이터베이스 관리 시스템(Database Management System - DBMS)**은 데이터의 방대한 집합체를 유지 관리하고 이용하는데 도움을 주도록 설계된 소프트웨어입니다. 데이터베이스 관리 시스템은 응용 프로그램과 데이터의 중재자로서 모든 응용 프로그램들이 데이터베이스를 공유하여 사용할 수 있도록 관리해주는 시스템으로 정의할 수 있습니다. 12 | 13 | 응용 프로그램에 데이터베이스에 저장된 데이터를 이용하기 위해서는 데이터베이스 관리 시스템을 통해서만 가능합니다. 이는 DBMS가 데이터베이스의 구성, 접근 방법, 관리 유지에 대한 모든 책임을 가진다는 것을 의미합니다. DBMS를 이용하는 응용 프로그램은 데이터베이스의 생성, 접근 방법, 처리 절차, 보안, 물리적 구조 등에 대해서 자세히 관련할 필요없이 원하는 데이터와 처리 작업을 DBMS에 요청만 하면 되는 구조를 가집니다. DBMS는 데이터베이스를 종합적으로 조직하고 접근하며 전체적으로 통제할 수 있는 프로그램들로 구성되어 있습니다. 14 | 15 | --- 16 | 17 | link:./01-4_database.adoc[이전: 데이터베이스] + 18 | link:./01-6_function_dbms.adoc[다음: 데이터베이스 관리 시스템의 기능] -------------------------------------------------------------------------------- /course/Module01_overview_database/contents/02-10_advantage_of_dbms.adoc: -------------------------------------------------------------------------------- 1 | = 데이터베이스 관리 시스템의 장점 2 | 3 | * 데이터 독립성 4 | * 효율적인 데이터 접근 5 | * 데이터 무결성과 보안성 6 | * 데이터 관리 7 | * 동시성 제어 및 장애 복구 8 | * 응용 프로그램 개발 시간 감소 9 | 10 | --- 11 | 12 | 데이터베이스 관리 시스템을 통해 데이터를 관리하여 기대할 수 있는 장점은 아래와 같습니다. 13 | 14 | == 데이터 독립성 15 | 응용 프로그램은 데이터의 표현 및 저장 세부 사항에 대해 될 수 있으면 독립적이어야 합니다. 데이터베이스 관리 시스템은 데이터에 대한 추상적인 관점을 제공하므로 응용 프로그램 코드와 데이터 저장에 대한 세부 사항을 분리할 수 있습니다. 16 | 17 | == 효율적인 데이터 접근 18 | 데이터베이스 관리 시스템은 데이터를 효율적으로 저장하고 검색하는 정교한 기법들을 다양하게 활용합니다. 이런 기능들은 데이터가 보조 기억장치(디스크)에 저장될 때 특히 중요합니다. 19 | 20 | == 데이터 무결성과 보안성 21 | 데이터를 데이터베이스 관리 시스템을 통해서만 접근할 수 있다면, 데이터베이스 관리 시스템은 데이터에 대한 무결성 제약 조건을 관리할 수 있습니다. 또한 여러 사용자들에게 어떤 데이터를 보여 줄 수 있는지를 제한하는 접근 제어를 실행할 수 있습니다. 22 | 23 | == 데이터 관리 24 | 여러 명의 사용자들이 데이터를 공유할 때에는 데이터에 대한 관리를 중앙 집중화할 수 있습니다. 관리하고 있는 데이터의 성질과 이를 이용하는 여러 종류의 사용자들을 이해하는 전문가를 통해 중복성을 최소화할 수 있도록 데이터를 조직하는 것과 효율적인 검색을 위한 저장법의 미세 조정 임무를 맡길 수 있습니다. 25 | 26 | == 동시성 제어 및 장애 복구 27 | 데이터베이스 관리 시스템은 동일 데이터에 대한 동시 접근을 스케줄링해서 사용자 관점에서 동시성에 대한 제어를 신경 쓸 필요를 없게 하며, 시스템의 장애로부터 사용자를 보호합니다. 28 | 29 | == 응용 프로그램 개발 시간 감소 30 | 고수준의 데이터 인터페이스를 제공합니다. 31 | 32 | --- 33 | 34 | link:./02-10_dbms_architecture.adoc[이전: 데이터베이스 관리 시스템 구조] + 35 | link:./02-lab01.adoc[다음: Lab1: MySQL 설치] -------------------------------------------------------------------------------- /course/Module01_overview_database/contents/02-1_chapter2_dbms.adoc: -------------------------------------------------------------------------------- 1 | = 데이터베이스 관리 시스템 개요 2 | 3 | 데이터베이스 관리 시스템 또는 DBMS는 데이터의 방대한 집합체를 유지 관리하고 이용하는데 도움을 주도록 설계된 소프트웨어입니다. 이 장에서는 데이터베이스 관리 시스템의 개요와 용도에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./02-2_filesystem_n_db.adoc[파일 시스템과 DBMS] 8 | 2. link:./02-3_dataspec_n_store.adoc[DBMS에서 데이터의 명세 및 저장] 9 | 3. link:./02-4_data_model.adoc[데이터 모델] 10 | 4. link:./02-5_data_independency.adoc[데이터 독립성] 11 | 5. link:./02-6_database_query.adoc[데이터베이스 질의] 12 | 6. link:./02-7_concurrency.adoc[동시 접근 및 복구] 13 | 7. link:./02-8_transaction.adoc[트랜잭션] 14 | 8. link:./02-9_dbms_architecture.adoc[DBMS의 구조] 15 | 9. link:./02-10_advantage_of_dbms.adoc[데이터베이스 관리 시스템의 장점] 16 | 17 | --- 18 | 19 | link:./01-6_function_dbms[이전: 데이터베이스 관리 시스템 기능] + 20 | link:./02-2_filesystem_n_db.adoc[다음: 파일 시스템과 데이터베이스] -------------------------------------------------------------------------------- /course/Module01_overview_database/contents/99_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 데이터베이스 시스템 개요 4 | * 데이터베이스 관리 시스템 5 | 6 | --- 7 | 8 | == Quiz 9 | 10 | 1. 논리적 데이터베이스 독립성이란 무엇이며 그것이 중요한 이유는 무엇일까요? 11 | 2. 논리적 데이터베이스 독립성과 물리적 데이터베이스 독립성의 차이점에 대해 설명하세요. 12 | 3. 외부, 내부, 개념 스키마의 차이점을 설명하세요, 이를 데이터 독립성과 연관 지어 설명하세요. 13 | 4. 파일시스템과 데이터베이스 관리 시스템의 차이에 대해 설명하세요. 14 | 15 | --- 16 | 17 | link:./18_lab01.adoc[이전: Lab1: MySQL 설치] -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image01.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image02.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image03.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image04.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image05.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image06.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image07.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image08.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image09.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image10.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image11.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image12.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image13.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image14.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image15.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image16.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image17.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image18.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image19.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image20.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image21.png -------------------------------------------------------------------------------- /course/Module01_overview_database/images/image22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module01_overview_database/images/image22.png -------------------------------------------------------------------------------- /course/Module01_overview_database/readme.adoc: -------------------------------------------------------------------------------- 1 | link:./contents/00_introduction.adoc[Module 01: 데이터베이스 시스템 개요] 2 | 3 | * link:./contents/01-1_chapter1_introduction_to_database_system.adoc[Chapter 1: 데이터베이스 시스템 개요] 4 | ** link:./contents/01-2_data_and_information.adoc[데이터와 정보] 5 | ** link:./contents/01-3_information_system.adoc[정보 시스템] 6 | ** link:./contents/01-4_database.adoc[데이터베이스] 7 | ** link:./contents/01-5_database_management_system.adoc[데이터베이스 관리 시스템] 8 | ** link:./contents/01-6_function_dbms.adoc[데이터베이스 관리 시스템의 기능] 9 | * link:./contents/02-1_chapter2_dbms.adoc[Chapter 2: 데이터베이스 관리 시스템] 10 | ** link:./contents/02-2_filesystem_n_db.adoc[파일 시스템과 DBMS] 11 | ** link:./contents/02-3_dataspec_n_store.adoc[DBMS에서 데이터의 명세 및 저장] 12 | ** link:./contents/02-4_data_model.adoc[데이터 모델] 13 | ** link:./contents/02-5_data_independency.adoc[데이터 독립성] 14 | ** link:./contents/02-6_database_query.adoc[데이터베이스 질의] 15 | ** link:./contents/02-7_concurrency.adoc[동시 접근 및 복구] 16 | ** link:./contents/02-8_transaction.adoc[트랜잭션] 17 | ** link:./contents/02-9_dbms_architecture.adoc[DBMS의 구조] 18 | ** link:./contents/02-10_advantage_of_dbms.adoc[데이터베이스 관리 시스템의 장점] 19 | * link:./contents/02-lab01.adoc[Lab 1: MySQL 설치] 20 | * link:./contents/99_review.adoc[검토] -------------------------------------------------------------------------------- /course/Module02_relational_model/code/01_creation_query_mysql.sql: -------------------------------------------------------------------------------- 1 | DROP DATABASE IF EXISTS Module02; 2 | CREATE DATABASE Module02; 3 | USE Module02; 4 | 5 | CREATE TABLE Category ( 6 | CategoryNo INTEGER, 7 | CategoryName VARCHAR(20) 8 | ); 9 | 10 | ALTER TABLE Category ADD CONSTRAINT pk_Category PRIMARY KEY(CategoryNo); 11 | 12 | CREATE TABLE Product ( 13 | ProductNo INTEGER, 14 | ProductName NVARCHAR(30), 15 | Price DECIMAL, 16 | CategoryNo INTEGER 17 | ); 18 | 19 | ALTER TABLE Product ADD CONSTRAINT pk_Product PRIMARY KEY(ProductNo); 20 | 21 | INSERT INTO Category VALUES (1, 'Novel'); 22 | INSERT INTO Category VALUES (3, 'History'); 23 | 24 | ALTER TABLE Product ADD CONSTRAINT fk_Product_Category FOREIGN KEY(CategoryNo) REFERENCES Category(CategoryNo); 25 | 26 | INSERT INTO Product (ProductNo, ProductName, Price) VALUES (20101927, 'The Second World War', 37800); 27 | UPDATE Product SET CategoryNo = 3 WHERE ProductNo = 20101927; 28 | INSERT INTO Product (ProductNo, ProductName, Price, CategoryNo) VALUES (97422537, 'Hobbit', 28800, 1); 29 | INSERT INTO Product (ProductNo, ProductName, Price, CategoryNo) VALUES (97422515, 'Lord of the Rings 1', 28800, 1); 30 | 31 | INSERT INTO Category VALUES (2, 'Science'); 32 | INSERT INTO Product (ProductNo, ProductName, Price, CategoryNo) VALUES (2312211, 'Cosmos', 28800, 2); 33 | -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/00_introduction.adoc: -------------------------------------------------------------------------------- 1 | = Module 02: 관계 모델 2 | 3 | 관계 모델은 IBM 연구소의 Dr. Codd가 제안하였으며, 계층형 모델과 네트워크 모델의 자리를 빠르게 대체하여 가장 많이 사용되는 데이터 모델로 자리잡았습니다. 이 모듈에서는 단순하여 우아한 데이터 모델인 관계 모델에 대해 알아봅니다. 4 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 5 | 6 | * 관계 모델의 구성요소에 대해 설명할 수 있습니다. 7 | * 릴레이션을 이해하고 릴레이션을 구성하는 요소들에 대해 설명할 수 있습니다. 8 | * 관계 모델 데이터베이스에서 폭 넓게 사용되는 용어들에 대해 이해하고 사용합니다. 9 | * 관계 모델의 제약조건에 대해 이해하고 설명할 수 있습니다. 10 | * 질의어에 대해 이해합니다. 11 | 12 | == Table of contents 13 | 14 | 1. link:./01-1_chapter1_introduction_to_relational_model.adoc[관계 모델 개요] 15 | 2. link:./02-1_chapter2_relation.adoc[릴레이션] 16 | 3. link:./03-1_chapter3_integrity_constraint.adoc[제약조건] 17 | 4. link:./04-1_chapter4_query.adoc[질의어] 18 | 19 | --- 20 | 21 | link:./02_chapter1_introduction_to_relational_model.adoc[다음: 관계 모델 개요] -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/01-1_chapter1_introduction_to_relational_model.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: 관계 모델 개요 2 | 3 | 1970년대 이론이 정립된 관계 모델은 가장 많이 사용되는 데이터 모델이며, Oracle, MS-SQL, DB2등 대부분의 상용 데이터베이스 관리 시스템이 사용하는 데이터 모델입니다. 이 단원에서는 관계 모델에 대해 공부합니다. 4 | 5 | == Table of Contents 6 | 1. link:./01-2_introduction_to_relational_model.adoc[관계 모델 개요] 7 | 2. link:./01-3_12_laws.adoc[Dr. Codd의 12법칙] 8 | 3. link:./01-4_history01.adoc[관계 데이터베이스 시스템 역사] 9 | 10 | --- 11 | 12 | link:./00_introduction.adoc[이전: 관계 모델] + 13 | link:./01-2_introduction_to_relational_model.adoc[다음: 관계 데이터 모델 개요] -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/01-2_introduction_to_relational_model.adoc: -------------------------------------------------------------------------------- 1 | = 관계 모델 2 | 3 | * 1970년 Dr. Codd에 의해 제안된 데이터 모델 4 | * DB2, Informix, Oracle, Sybase, MSSQL Server, MySQL등 많은 DBMS의 데이터 모델 5 | * 아주 단순하며 우아한 모델 6 | ** 관계 논리식과 관계 대수식에 기반한한 데이터 조회 및 저장 7 | ** 데이터베이스는 하나 이상의 릴레이션의 집합으로, 테이블 형식으로 데이터 표현 8 | ** 데이터베이스를 제어하는 고수준의 언어를 사용하여 데이터의 표현과 복잡한 질의를 쉽게 처리 9 | ** 관계형 데이터베이스가 지켜야 하는 조건을 제시 – Dr. Codd의 12규칙 (Dodd’s 12 Rule)로 유명 10 | 11 | --- 12 | 13 | 1970년, IBM 연구소의 Edgar Frank Codd 박사가 제안한 모델로, 계층형 모델과 네트워크 모델이 지배하고 있던 데이터베이스 산업에 혁명을 일으킨 데이터 모델입니다. 14 | 15 | 관계 모델은 매우 단순하며 우아합니다. 관계 모델에서 데이터베이스는 하나 이상의 릴레이션(Relation)들의 집합인데, 한 릴레이션은 행(row)과 열(Column)을 가진 일종의 테이블 형태로 표시됩니다. 단순한 테이블 형태로 데이터를 표현함에 따라 데이터에 대한 전문적인 지식이 없는 사용자들도 데이터베이스의 내용을 이해할 수 있도록 하며, 관계 논리와 관계 해석을 이용한 고 수준의 언어를 제공하여 데이터를 조회하고 제어할 수 있게 합니다. 16 | 17 | 관계 모델은 그 이전의 데이터 모델과 비교하여 단순한 데이터 표현이 가능하고, 고수준의 언어를 사용하여 복잡한 질의를 쉽게 표현할 수 있는 장점이 있습니다. 18 | 19 | --- 20 | 21 | link:./01-1_chapter1_introduction_to_relational_model.adoc[이전: 관계 모델 개요] + 22 | link:./01-3_12_laws.adoc[다음: Dr.codd의 12 법칙] -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/01-5_history02.adoc: -------------------------------------------------------------------------------- 1 | = 관계 데이터베이스 시스템 역사 (2) 2 | 3 | * Informix 4 | ** System R에 기초를 둔 DBMS로 2001년 IBM에 인수됨 5 | ** 객체 관계 데이터 모델로 발전 6 | * Sybase 7 | ** Ingres 프로젝트에 참여한 Bob Ebstain과 Mark Hoffman이 1984년 설립 8 | ** 클라이언트/서버 환경에서 최적의 DBMS를 제공하여 Oracle의 가장 강력한 경쟁자가 됨 9 | * Microsoft SQL Server 10 | ** Sybase를 기반으로 Microsoft가 1989년 개발한 관계형 데이터베이스 시스템 11 | ** 2019년 Microsoft SQL Server 2019 발표 12 | 13 | --- 14 | 15 | == Informix 16 | 1981년, System R 프로젝트를 기반으로 RDS에 의해 개발되었으며 1986년 회사 이름을 Informix로 변경한 후 세계에서 가장 널리 쓰이는 데이터베이스 시스템 중의 하나로 성장했습니다. 1997년 IBM에 흡수 된 후 에센셜 소프트웨어로 이름이 변경되었습니다. 17 | 18 | == Sybase 19 | 버클리 대학교에서 Ingres 프로젝트에 참여했던 Bob Ebstain은 1984년 Mark Hoffman과 Sybase를 설립합니다. Sybase는 1980년대 중반의 대표적인 네트워크 환경이었던 클라이언트/서버 환경에 최적화된 관계형 데이터베이스 관리 시스템을 제공하여 Oracle의 강력한 경쟁자로 떠올랐고, 이후 많은 관계형 데이터베이스 시스템에 영향을 주었습니다. 20 | 21 | == Microsoft SQL Server 22 | Microsoft는 1980년대 중반부터 Sybase 데이터베이스의 기술 지원을 담당했으며, 이를 위해서 Sybase에서 관계형 데이터베이스 관리 시스템의 기술을 이전 받았습니다. Microsoft 1989년 Sybase로부터 모든 기술을 이전 받았으며, 이 기술을 기반으로 Microsoft SQL Server를 개발하였으며, 현재 상용 솔루션으로 Oralce, DB2와 함께 가장 많은 점유율을 가지고 있습니다. 23 | 24 | --- 25 | 26 | link:./01-4_history01.adoc[이전: 관계 데이터베이스 시스템 역사 1] + 27 | link:./01-6_history03.adoc[다음: 관계 데이터베이스 시스템 역사 3] -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/02-1_chapter2_relation.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: 릴레이션 2 | 3 | 관계 모델에서 데이터의 표현은 릴레이션으로 구성되며, 릴레이션은 릴레이션 스키마와 릴레이션 인스턴스로 이루업니다. 이 단원에서는 관계 모델의 가장 중요한 구성 요소인 릴레이션에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./02-2_relation_schema.adoc[릴레이션 스키마] 8 | 2. link:./02-3_relation_instance.adoc[릴레이션 인스턴스] 9 | 3. link:./02-4_domain.adoc[도메인] 10 | 4. link:./02-5_relational_database.adoc[관계 데이터베이스] 11 | 12 | --- 13 | 14 | link:./01-6_history03.adoc[관계 데이터베이스 시스템의 역사 3] + 15 | link:./02-2_relation_schema.adoc[다음: 릴레이션 스키마] -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/02-2_relation_schema.adoc: -------------------------------------------------------------------------------- 1 | = 릴레이션 스키마 2 | 3 | * 관계 모델에서 릴레이션 스키마는 데이터베이스의 구조와 제약조건에 관한 전반적인 명세를 의미 4 | * `개체(Entity)` 와 개체의 특성을 나타내는 `속성(Attribute)` , `개체 간의 관계(Relation)` , 이들의 `제약 조건(Constraint)` 을 기술한 것 5 | * 릴레이션 스키마 명세 6 | ** 릴레이션 이름 7 | ** `필드(Field)` 또는 `열(Column)` , 또는 `속성(Attribute)` 의 이름 8 | ** 각 속성의 `도메인(Domain)` 이름 9 | 10 | --- 11 | 12 | 관계 모델에서 데이터 표현의 주 구성물은 `릴레이션(Relation)` 입니다. 릴레이션은 릴레이션 `스키마(Relation Schema)` 와 릴레이션 `인스턴스(Relation Instance)` 로 이루어집니다. 13 | 14 | 릴레이션 스키마는 릴레이션을 정의하는 청사진(Blue Print)이며, 릴레이션은 릴레이션 스키마를 기반으로 실제 데이터가 저장되는 테이블이 릴레이션 인스턴스 입니다. (객체지향 프로그래밍에서 클래스와 인스턴스의 관계와 유사합니다) 15 | 릴레이션 스키마는 그 릴레이션의 이름, 각 `필드(Field)` 또는 `열(Column)` 또는 `속성(Attribute)` 의 이름, 각 속성의 `도메인(Domain)` 을 명세합니다. 도메인은 속성의 값, 타입 제약조건 등에 대한 값의 범위로, 릴레이션 스키마에서는 `도메인 이름(Domain Name)` 으로 명세합니다. 16 | 17 | 학교 데이터베이스에서 학생 데이터를 저장하고자 설계하는 릴레이션 스키마의 예는 다음과 같습니다. 18 | 19 | image:../images/image02.png[] 20 | 21 | --- 22 | 23 | link:./02-1_chapter2_relation.adoc[이전: 릴레이션] + 24 | link:./02-3_relation_instance.adoc[다음: 릴레이션 인스턴스] -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/02-3_relation_instance.adoc: -------------------------------------------------------------------------------- 1 | = 릴레이션 인스턴스 2 | 3 | * `레코드(Record)` 라고도 불리는 `투플(Tuple)` 의 집합 4 | * `투플(Tuple)` 5 | ** 릴레이션 스키마에서 정의된 각 `속성(필드)` 로 정의되며, 하나의 데이터 묶음을 나타냅 6 | ** 릴레이션 인스턴스에서는 각 투플을 하나의 `행(row)` 으로 구성 7 | * 릴레이션 인스턴스의 투플 수: `카디널리티(Cardinality)` 8 | * 릴레이션 인스턴스의 속성(필드) 수: `차수(Degree 또는 Arity)` 9 | * 릴레이션 인스턴스의 투플 순서는 중요하지 않음 10 | 11 | --- 12 | 13 | `릴레이션 인스턴스(Relation Instance)` 는 `레코드(Record)` 라고도 하는 `투플(Tuple)` 의 집합이며, 각 투플은 릴레이션 스키마에서 정의된 필드로 구성됩니다. 릴레이션 인스턴스는 투플을 행으로 보고 각 행은 같은 수의 필드로 구성된 일종의 테이블로 생각할 수 있습니다. 14 | 15 | 릴레이션 인스턴스에서 투플이 나열된 순서는 중요하지 않으며, 필드의 이름을 사용하는 경우라면 필드의 순서 또한 중요하지 않습니다. 16 | 17 | 릴레이션 스키마는 릴레이션 인스턴스의 각 필드의 도메인을 명세하며 각 필드는 도메인에 정의된 범위를 따라야 하는 `도메인 제약조건(Domain Constraint)` 를 따라 필드에 존재할 수 있는 데이터의 값을 제한합니다. 18 | 19 | 릴레이션 인스턴스에 존재하는 투플의 수를 `카디널리티(Cardinality)` 라고 하며, 릴레이션 인스턴스의 필드 수를 `차수(Degree 또는 Arity)` 라고 합니다. 20 | 21 | --- 22 | 23 | link:./02-2_relation_schema.adoc[이전: 릴레이션 스키마] + 24 | link:./02-4_domain.adoc[다음: 도메인] 25 | -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/02-4_domain.adoc: -------------------------------------------------------------------------------- 1 | = 도메인 2 | 3 | * 하나의 속성이 가질 수 있는 동일한 유형의 원자값들의 집합 4 | * 릴레이션 스키마는 릴레이션 인스턴스의 각 필드의 도메인을 명세(도메인 제약조건) 5 | * 프로그래밍 언어 관점에서 필드의 데이터 타입을 의미 6 | * `R(f~i~:D1, … f~n~:Dn)` 을 릴레이션 스키마라고 하고, 각 `f~i~, 1 ≤ i ≤ n` 에 대한 이름이 `D~i~` 인 도메인에 대한 집합을 `Dom~i~` 이라고 할 때, 도메인 제약조건을 만족하는 R의 인스턴스는 다음과 같이 n개의 필드를 가진 투플의 한 집합이 됨 7 | 8 | `{ | d~1~ ∈ Dom~1~, … d~n~ ∈ Dom~n~}` 9 | 10 | --- 11 | 12 | 릴레이션 스키마는 릴레이션 인스턴스의 각 필드, 즉 열의 도메인을 명세합니다. 스키마 내의 이러한 `도메인 제약조건(Domain Constraint)` 은 그 릴레이션 인스턴스가 지켜야 하는 중요한 조건으로서, 어떤 열의 값은 해당 도메인으로부터 나와야 한다는 것을 의미합니다. 따라서 어떤 필드의 도메인은 프로그래밍 언어 관점에서 보면 해당 필드의 타입으로서, 그 필드에 나올 수 있는 값을 제한합니다. 13 | 14 | 정식으로 표현하자면, `R(f~1~:D~1~, … f~n~:D~n~)` 을 릴레이션 스키마라고 하고, 각 `f~i~, 1 ≤ i ≤ n` 에 대한 이름이 `D~i~` 인 도메인에 대한 집합을 `Dom~i~` 라고 할 때, 도메인 제약조건을 만족하는 R의 인스턴스는 다음과 같이 n개의 필드를 가진 투플의 한 집합이 됩니다. 15 | 16 | `{ | d~1~ ∈ Dom~1~, … d~n~ ∈ Dom~n~}` 17 | 18 | 여기에서 < … >는 한 투플의 필드들을 표시하며 중괄호 { … }는 집합(여기에서는 투플의 집합)을 나타냅니다. 수직 막대 | 는 ‘다음을 만족하는'을 의미하고, 기호 ∈ 는 ‘포함된다’를 나타내며, 수직 막대의 오른쪽은 이 집합에 속하는 투플의 필드 값들이 반드시 지켜야 하는 조건입니다. 19 | 20 | --- 21 | 22 | link:./02-3_relation_instance.adoc[이전: 릴레이션 인스턴스] + 23 | link:./02-5_relational_database.adoc[다음: 관계 데이터베이스] 24 | -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/02-5_relational_database.adoc: -------------------------------------------------------------------------------- 1 | = 관계 데이터베이스 2 | 3 | * 관계 데이터베이스(Relational Database) + 4 | 서로 다른 릴레이션 이름을 가진 릴레이션들의 모임 5 | * 관계 데이터베이스 스키마(Relational Database Schema) + 6 | 데이터베이스에 속한 릴레이션의 스키마들의 집합 7 | 8 | --- 9 | 10 | `관계 데이터베이스(Relational database)` 는 서로 다른 릴레이션 이름을 가진 릴레이션들의 모임입니다. `관계형 데이터베이스 스키마(Relational database schema)` 는 그 데이터베이스에 속한 릴레이션의 스키마들의 집합입니다. 11 | 12 | 아래와 같은 릴레이션 스키마가 있을 때, 13 | 14 | _상품분류(분류번호: 정수, 분류이름: 문자열) + 15 | 상품(상품번호: 정수, 모델번호: 문자열, 상품이름: 문자열, 상품가격: 실수, 설명: 문자열, 분류번호: 정수) + 16 | 장바구니(장바구니번호: 정수, 수량: 정수, 날짜: 날짜, 상품번호: 정수) + 17 | 고객(고객번호: 정수, 고객이름: 문자열, 전자메일: 문자열, 암호: 문자열) + 18 | 구매(구매번호: 정수, 주문일자: 날짜, 고객번호: 정수) + 19 | 주문상세(상품번호: 숫자, 구매번호:정수, 수량: 숫자)_ 20 | 21 | 쇼핑몰 데이터베이스는 _상품 분류, 상품, 장바구니, 고객, 구매, 주문상세_ 라는 이름의 릴레이션으로 이루어집니다. 관계형 데이터베이스의 인스턴스는 해당 데이터베이스의 스키마에 속하는 각 릴레이션 스키마마다 하나의 릴레이션 인스턴스들로 구성됩니다. 각 릴레이션 인스턴스는 스키마상의 도메인 제약 조건을 만족해야 합니다. 22 | 23 | --- 24 | 25 | link:./02-4_domain.adoc[이전: 도메인] + 26 | link:./02-lab2-1a.adoc[다음: Lab 2-1a SQL을 사용한 릴레이션 생성 및 수정(MySQL)] -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/03-1_chapter3_integrity_constraint.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 3: 무결성 제약조건 2 | 3 | 저장되는 데이터의 품질에 따라 데이터베이스의 품질이 결정됩니다. 관계형 데이터베이스는 도메인 무결성, 개체 무결성 및 참조 무결성을 이용하여 데이터의 품질을 보장하고, 데이터베이스 관리 시스템은 부정확한 정보가 입력되는 것을 방지하는 수단인 제약조건을 강제합니다. 이 단원에서는 무결성 제약조건에 대해 공부합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03-2_introduction_to_ic.adoc[무결성 제약조건 개요] 8 | 2. link:./03-3_entity_integrity.adoc[개체 무결성] 9 | 3. link:./03-4_referential_integrity.adoc[참조 무결성] 10 | 4. link:./03-5_domain_integrity.adoc[도메인 무결성] 11 | 5. link:./03-6_enforce_ic.adoc[무결성 제약조건 집행] 12 | 13 | --- 14 | 15 | link:./02-lab2-1d.adoc[다음: Lab 2-1 SQL을 사용한 릴레이션 생성 및 수정(Postgres)] + 16 | link:./03-2_introduction_to_ic.adoc[다음: 무결성 제약조건 개요] -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/03-2_introduction_to_ic.adoc: -------------------------------------------------------------------------------- 1 | = 무결성 제약조건 개요 2 | 3 | * 저장된 정보의 품질에 따라 데이터베이스의 품질이 결정됨 4 | * DBMS는 부정확한 정보가 입력되는 것을 방지하는 수단을 가지고 있어야 함 5 | * 무결성 제약조건(Integrity Constraint) 6 | ** 데이터베이스 스키마에 명세 되어 있는 조건 7 | ** 데이터베이스 인스턴스에 저장될 수 있는 데이터를 제한 8 | * 적법한(Legal) 인스턴스 + 9 | 데이터베이스 스키마에 명세 된 무결성 제약조건들을 모두 만족하는 데이터베이스 인스턴스 10 | * DSBMS는 무결성 제약조건들을 집행(enforce)하여 데이터베이스를 접합하게 만듦 11 | 12 | --- 13 | 14 | 저장되는 데이터의 품질에 따라 데이터베이스의 품질이 결정됩니다. 따라서 데이터베이스 관리 시스템은 부정확한 정보가 입력되는 것을 방지하는 수단을 가지고 있어야 합니다. 15 | 16 | 관계형 데이터베이스는 `무결성 제약 조건(Integrity Constraint)` 을 사용하여 데이터베이스에 부정확한 데이터가 입력되는 것을 방지합니다. 무결성 제약 조건은 데이터베이스 스키마에 명세 되어 있는 조건으로서, 데이터베이스 인스턴스에 저장될 수 있는 데이터를 제한합니다. 해당 데이터베이스 스키마에 명세 되어 있는 무결성 제약 조건들을 다 만족하는 데이터베이스 인스턴스를 적법한(Legal) 인스턴스라고 합니다. DBMS는 무결성 제약 조건들을 집행함으로써 데이터베이스에 적법한 릴레이션 인스턴스만 저장될 수 있도록 합니다. 17 | 18 | 무결성 제약조건의 명세와 집행 시기는 서로 다릅니다. 19 | 20 | **명세** + 21 | 데이터베이스 관리자가 데이터베이스 스키마를 정의할 때 데이터베이스 인스턴스에서 지켜야 할 무결성 제약 조건이 정의됩니다. 22 | 23 | **집행** + 24 | 데이터베이스 응용이 실행될 때 DBMS는 명세되어 있는 무결성 제약 조건들을 위반하는 사항이 있는지 검사한 후 이를 위반하는 데이터 변경 시도에 대해 집행을 불허합니다. 25 | 26 | --- 27 | 28 | link:./03-1_chapter3_integrity_constraint.adoc[이전: Chapter 3: 무결성 제약 조건] + 29 | link:./03-3_entity_integrity.adoc[다음: 개체 무결성] -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/03-5_domain_integrity.adoc: -------------------------------------------------------------------------------- 1 | = 도메인 무결성 2 | 3 | * 릴레이션의 각 속성은 필드에는 일관된 데이터가 저장되어야 함 4 | * 속성에 지정된 형식이 아닌 다른 형식의 데이터는 포함될 수 없어야 함 5 | * 도메인 제약조건(Domain Constaint)으로 도메인 무결성을 유지 6 | * 릴레이션의 각 속성에 포함되는 데이터의 형식을 제약 7 | ** 각 속성의 값은 반드시 원자값이어야 함 8 | ** 속성에 지정된 도메인의 범위 내에 해당하는 값이어야 함 9 | ** 속성의 기본 값과 null 포함 가능 여부등에 대한 제약조건 10 | 11 | --- 12 | 13 | 릴레이션 스키마는 릴레이션 인스턴스의 각 필드에 저장될 수 있는 데이터의 범위인 도메인을 명세합니다. 릴레이션의 각 `속성(필드)` 에는 범위에 지정된 일관된 데이터만 저장되어야 하며, 이를 `도메인 무결성(Domain Integrity)` 이라고 합니다. 14 | 15 | 도메인 무결성은 각 속성(필드)에 지정된 도메인의 범위를 벗어나는 값을 저장할 수 없도록 하는 제약 조건인 `도메인 제약조건(Domain Constraint)` 로 유지됩니다. 도메인은 하나의 속성이 가질 수 있는 동일한 유형의 원자값들의 집합을 의미하여, 데이터 형식 등 값들의 유형을 정의합니다. 16 | 17 | 또한 속성(필드)의 기본 값을 지정하고, null을 허용할 것인지의 여부 등도 지정할 수 있습니다. DBMS는 투플이 삽입되거나 수정될 때 마다 도메인 제약조건을 검사하며, 도메인 제약조건에 위배되는 연산은 거부합니다. 18 | 19 | --- 20 | 21 | link:./03-4_referential_integrity.adoc[이전: 참조 무결성] + 22 | link:./03-6_enforce_ic.adoc[다음: 무결성 제약조건 집행] 23 | -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/04-1_chapter4_query.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 4: 질의어 2 | 3 | DBMS는 질의를 작성하기 위한 특수 언어인 질의어(Query Language)를 제공합니다. 이 장에서는 관계형 데이터베이스에서 데이터를 질의하기 위해 사용되는 질의어와 SQL 언어에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./04-2_introduction_to_query.adoc[관계 데이터베이스 질의] 8 | 2. link:./04-3_sql.adoc[SQL] 9 | 10 | --- 11 | 12 | link:./03-6_enforce_ic.adoc[이전: 무결성 제약조건 집행] + 13 | link:./04-2_introduction_to_query.adoc[다음: 관계 데이터베이스 질의] -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/04-2_introduction_to_query.adoc: -------------------------------------------------------------------------------- 1 | = 관계 데이터베이스 질의 2 | 3 | * 데이터에 관한 문의 4 | * 결과로 구성된 새 릴레이션을 반환 5 | * DBMS는 질의를 작성하기 위한 특수 언어인 질의어(Query Language)를 제공 6 | 7 | --- 8 | 9 | `관계형 데이터베이스 질의(Relational Database Query)` 는 데이터에 대한 문의이며, 그 답은 결과로 구성된 새로운 릴레이션입니다. 관계형 데이터베이스 질의는 결과로 구성된 새 릴레이션을 답으로 반환합니다. 10 | 11 | Dr. Codd의 12법칙 중 5번 규칙을 다시 살펴보면 다음과 같습니다. 12 | 13 | **규칙 5: "종합적인 데이터 보조언어 규칙"** + 14 | 시스템은 적어도 하나의 관계형 언어를 지원하되, 그 관계형 언어는 다음의 특징을 가져야 한다. 15 | 16 | 가) 선형 문법을 가진다. + 17 | 나) 대화형(interactively)으로 이용될 수도 있고, 애플리케이션 프로그램 안에서 이용될 수 있다. + 18 | 다) 데이터 정의 동작(data definition operations)을 지원해야 한다. (뷰(view)에 대한 정의도 할 수 있어야 한다.) 데이터 조작 동작(data manipulation operations)를 지원해야 한다. 보안과 무결성 제약조건 그리고 트랜잭션 관리 동작(비긴, 커밋, 롤백)을 지원해야 한다. 19 | 20 | 모든 관계형 데이터베이스는 데이터를 만들고 조작할 수 있는 내부 언어를 가지고 있어야 합니다. DBMS는 질의를 작성하기 위한 특수한 형태의 `질의어(Query Language)` 를 제공합니다. 21 | 22 | --- 23 | 24 | link:./04-1_chapter4_query.adoc[이전: Chapter 4: 질의어] + 25 | link:./04-3_sql.adoc[다음: SQL] 26 | -------------------------------------------------------------------------------- /course/Module02_relational_model/contents/99_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 관계 모델 4 | * 릴레이션 5 | * 무결성 제약조건 6 | * 질의어 7 | 8 | --- 9 | 10 | == Quiz 11 | 12 | 1. 다음 용어를 설명하세요: 13 | A. 릴레이션 스키마 14 | B. 관계 데이터베이스 스키마 15 | C. 도메인 16 | D. 릴레이션 인스턴스 17 | E. 릴레이션 카디널리티 18 | F. 릴레이션 차수 19 | 2. SQL 질의 작성자의 입장에서, 물리적 데이터 독립성과 논리적 데이터 독립성을 관계 모델이 어떻게 지원하는지 설명하세요. 20 | 3. 슈퍼 키, 후보 키, 기본 키에 대해서 설명하세요. 21 | 4. 참조 무결성과 외래 키 제약조건에 대해서 설명하세요. 22 | 5. 릴레이션 스키마가 다음과 같을 때 질문에 답하세요. 23 | + 24 | _직원 (직원번호: 정수, 직원이름: 문자열, 나이: 정수, 급여: 실수) + 25 | 근무 (직원번호: 정수, 부서번호: 정수, 근무시간: 정수) + 26 | 부서 (부서번호: 정수, 부서이름: 문자열, 예산: 실수, 부서장번호: 정수)_ 27 | + 28 | A. 부서 릴레이션에 대한 외래 키 제약조건의 예를 설명하세요. 사용자가 부서의 한 투플을 샂게하려고 할 때 이 제약조건들을 집행하는 방식에는 어떤 것들이 있는지 설명하세요. 29 | B. 위의 릴레이션을 생성하는 SQL 문장을 작성하세요. 기본 키 및 외래 키 제약조건을 모두 명세해야 합니다. 30 | C. 모든 부서에는 부서장이 있어야 하도록 부서 릴레이션을 작성하는 SQL 문을 작성하세요. 31 | D. 모든 직원들이 급여를 10% 인상하는 SQL 질의를 작성하세요. 32 | E. `HR` 부서를 삭제하는 SQL 문을 작성하세요. 참조 무결성 제약조건에 따라 발생할 수 있는 일들을 설명하세요. 33 | 34 | --- 35 | 36 | link:./04-lab2-2d.adoc[Lab 2-2d : SQL을 사용한 무결성 제약조건 설정 (Postgres)] -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image01.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image02.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image03.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image04.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image05.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image06.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image07.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image08.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image09.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image10.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image11.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image12.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image13.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image14.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image15.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image16.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image17.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image18.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image19.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image20.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image21.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image22.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image23.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image24.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image25.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image26.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image27.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image28.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image29.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image3.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image30.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image31.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image32.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image33.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image34.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image35.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image36.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image37.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image38.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image39.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image40.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image41.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image42.png -------------------------------------------------------------------------------- /course/Module02_relational_model/images/image43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module02_relational_model/images/image43.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/code/Table_creation_MySQL.sql: -------------------------------------------------------------------------------- 1 | DROP DATABASE IF EXISTS Module03; 2 | 3 | CREATE DATABASE Module03; 4 | 5 | USE Module03; 6 | 7 | CREATE TABLE Category ( 8 | CategoryNo int, 9 | CategoryName varchar(50) NOT NULL, 10 | CONSTRAINT pk_Category PRIMARY KEY(CategoryNo) 11 | ); 12 | 13 | CREATE TABLE Product ( 14 | ProductNo int PRIMARY KEY, 15 | ProductName varchar(100) NOT NULL, 16 | UnitPrice int DEFAULT 0 NOT NULL, 17 | Description text, 18 | CategoryNo int, 19 | CONSTRAINT fk_Product_CategoryID FOREIGN KEY(CategoryNo) REFERENCES Category(CategoryNo) 20 | ); 21 | 22 | CREATE TABLE Customer ( 23 | CustomerNo int, 24 | CustomerName nvarchar(10), 25 | Email varchar(40), 26 | Password varchar(16), 27 | CONSTRAINT pk_Customer PRIMARY KEY(CustomerNo) 28 | ); 29 | 30 | CREATE TABLE Orders ( 31 | OrderNo int, 32 | OrderDate Date, 33 | CustomerNo int, 34 | 35 | CONSTRAINT pk_Order PRIMARY KEY(OrderNo), 36 | CONSTRAINT fk_Order_Customer FOREIGN KEY(CustomerNo) REFERENCES Customer(CustomerNo) 37 | ); 38 | 39 | CREATE TABLE OrderDetail ( 40 | ProductNo int, 41 | OrderNo int, 42 | Quantity int, 43 | 44 | CONSTRAINT pk_OrderDetail PRIMARY KEY(ProductNo, OrderNo), 45 | CONSTRAINT fk_OrderDetail_Order FOREIGN KEY(OrderNo) REFERENCES Orders(OrderNo) 46 | ); -------------------------------------------------------------------------------- /course/Module03_disk_and_file/code/Table_creation_PostgreSQL.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE Category ( 2 | CategoryNo int, 3 | CategoryName varchar(50) NOT NULL, 4 | CONSTRAINT pk_Category PRIMARY KEY(CategoryNo) 5 | ); 6 | 7 | CREATE TABLE Product ( 8 | ProductNo int PRIMARY KEY, 9 | ProductName varchar(100) NOT NULL, 10 | UnitPrice int DEFAULT 0 NOT NULL, 11 | Description text, 12 | CategoryNo int, 13 | CONSTRAINT fk_Product_CategoryID FOREIGN KEY(CategoryNo) REFERENCES Category(CategoryNo) 14 | ); 15 | 16 | CREATE TABLE Customer ( 17 | CustomerNo int, 18 | CustomerName varchar2(10), 19 | Email varchar(40), 20 | Password varchar(16), 21 | CONSTRAINT pk_Customer PRIMARY KEY(CustomerNo) 22 | ); 23 | 24 | CREATE TABLE Orders ( 25 | OrderNo int, 26 | OrderDate Date, 27 | CustomerNo int, 28 | 29 | CONSTRAINT pk_Order PRIMARY KEY(OrderNo), 30 | CONSTRAINT fk_Order_Customer FOREIGN KEY(CustomerNo) REFERENCES Customer(CustomerNo) 31 | ); 32 | 33 | CREATE TABLE OrderDetail ( 34 | ProductNo int, 35 | OrderNo int, 36 | Quantity int, 37 | 38 | CONSTRAINT pk_OrderDetail PRIMARY KEY(ProductNo, OrderNo), 39 | CONSTRAINT fk_OrderDetail_Order FOREIGN KEY(OrderNo) REFERENCES Orders(OrderNo) 40 | ); -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/00_introduction.adoc: -------------------------------------------------------------------------------- 1 | = Module 03: 디스크와 파일 2 | 3 | DBMS 내부의 데이터는 디스크나 테이프 같은 저장장치에 저장됩니다. DBMS는 논리적 스키마와 물리적 스키마르 분리하기 위해 데이터가 저장되는 구조와 논리적 기술구조를 분리합니다. DBMS는 데이터를 디스크에 효율적으로 저장하고 조회하기 위해 디스크 공간 관리자, 버퍼 관리자등의 여러 구성요소로 나누어 처리합니다. 이 모듈에서는 디스크와 파일에 대해 공부합니다. 4 | 5 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 6 | 7 | * 일반적인 데이터베이스 관리 시스템의 디스크와 파일 저장 구조에 대해 이해합니다. 8 | * 데이터베이스의 디스크 공간 관리에 대해 설명할 수 있습니다. 9 | * 버퍼 관리자를 통한 메모리 관리와 이에 따른 규칙들을 설명할 수 있습니다. 10 | * 관계형 데이터베이스의 레코드 형식과 페이지 형식에 대해 이해합니다. 11 | * 파일과 인덱스에 대해 설명할 수 있습니다. 12 | * 관계형 데이터 모델과 같은 형식으로 저장되는 시스템 카탈로그에 대해 설명할 수 있습니다. 13 | 14 | == Table of Contents 15 | 1. link:./01-1_chapter1_memory_hi.adoc[기억장치 계층 구조] 16 | 2. link:./02-1_chapter2_disk.adoc[디스크] 17 | 3. link:./03-1_chapter3_disk_space_mgt.adoc[디스크 공간 관리] 18 | 4. link:./04-1_chapter4_buffer_manager.adoc[버퍼 관리자] 19 | 5. link:./05-1_chapter5_record.adoc[레코드 형식] 20 | 6. link:./06-1_chapter6_page.adoc[페이지 형식] 21 | 7. link:./07-1_chapter7_file_index.adoc[파일과 인덱스] 22 | 8. link:./08-1_chapter8_system_cat.adoc[시스템 카탈로그] 23 | 24 | --- 25 | 26 | link:./01-1_chapter1_memory_hi.adoc[다음: 기억장치 계층 구조] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/01-1_chapter1_memory_hi.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: 기억장치 계층 구조 2 | 3 | 컴퓨터 시스템의 기억장치는 캐시와 주기억장치로 구성되는 1차 저장장치, 디스크 등으로 구성되는 2차 저장장치, 테이프 등으로 구성되는 3차 저장장치 등의 계층 구조로 구성됩니다. 이 장에서는 기억장치 계층구조에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./01-2_overview_disk_and_file.adoc[디스크와 파일 개요] 8 | 2. link:./01-3_storage_hire.adoc[기억장치 계층구조 개요] 9 | 10 | --- 11 | 12 | link:./00_introduction.adoc[이전: Module 03: 디스크와 파일] + 13 | link:./01-2_overview_disk_and_file.adoc[다음: 디스크와 파일 구조] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/01-2_overview_disk_and_file.adoc: -------------------------------------------------------------------------------- 1 | = 디스크와 파일 개요 2 | 3 | image:../images/image01.png[] 4 | 5 | --- 6 | 7 | DBMS 내부의 데이터는 디스크나 테이프와 같은 저장 장치에 저장됩니다. 데이터베이스 관리 시스템은 계층화된 기억 장치로 관리되고, 각 기억장치는 각 장치를 관리하는 계층적으로 독립된 구성요소들에 의해 관리됩니다. 8 | 9 | 디스크 관리자는 가용한 디스크 공간을 추적 감시하는 역할을 수행합니다. 파일 관리자는 레코드로 구성된 파일에 대한 고수준의 서비스를 상위 계층의 구성요소로 전달해주는 역할을 수행하며, 디스크의 공간을 얻거나 반환하는 요청을 디스크 관리자로 전달합니다. 파일 관리자는 페이지 단위로 디스크 공간을 요청하거나 반환합니다. 페이지의 크기는 DBMS의 파라미터로 일반적인 크기는 4KB나 8KB 정도입니다. 파일 관리자는 파일 내의 페이지들을 추적 감시하고 페이지 내의 레코드들을 배치하는 역할을 수행합니다. 10 | 11 | 처리 과정 중에 레코드가 필요하게 되면, 레코드는 디스크로부터 주 기억장치로 반입(fetch)됩니다. 레코드가 위치하는 페이지는 파일 관리자가 결정합니다. 파일 관리자는 원하는 레코드를 포함하는 페이지를 빨리 찾기 위하여 보조 데이터 구조를 사용하기도 합니다. 원하는 페이지를 찾으면 파일 관리자는 그 페이지에 대한 요청을 버퍼 관리자라고 하는 DBMS 코드의 한 계층으로 전달합니다. 버퍼 관리자는 요청 페이지를 디스크로 부터 가져와서 버퍼 풀이라고 하는 주 기억장치의 한 구역에 적재하고 파일 관리자에게 알립니다. 12 | 13 | --- 14 | 15 | link:./01-1_chapter1_memory_hi.adoc[이전: Chapter 1: 기억장치 계층 구조] + 16 | link:./01-3_storage_hire.adoc[다음: 기억장치 계층 구조] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/02-1_chapter2_disk.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: 디스크 2 | 3 | 디스크는 컴퓨터 시스템에서 2차 저장장치를 구성하는 데이터 저장소로, 테이프 등의 3차 저장장치보다는 빠르지만 메모리 등의 1차 저장장치보다는 느린 임의 접근 가능 데이터 저장소입니다. 이 장에서는 디스크에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 1. link:./02-2_hdd.adoc[HDD] 7 | 2. link:./02-3_ssd.adoc[SSD] 8 | 3. link:./02-4_performance_storage.adoc[디스크의 성능] 9 | 10 | --- 11 | 12 | link:./01-3_storage_hire.adoc[이전: 기억장치 계층구조] + 13 | link:./02-2_hdd.adoc[다음: HDD(Hard Disk Drive)] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/02-3_ssd.adoc: -------------------------------------------------------------------------------- 1 | = SSD (Solid State Drive) 2 | 3 | * 플래시 메모리를 기반으로 한 저장 매체로, Random Access 가능한 빠른 속도의 저장 장치 4 | * 모든 구성요소가 전기장치이며, 기계 장치를 가지지 않음 5 | 6 | image:../images/image04.png[] 7 | 8 | --- 9 | 10 | SSD는 플래시 메모리를 장점을 활용하여 HDD와 동일한 형태로 개발된 대용량 플래시 메모리입니다. 자기장을 이용하는 HDD와는 달리 낸드 플래시 반도체를 사용하여 정보를 저장합니다. 임의 접근 방식을 사용하여 탐색 시간없이 고속으로 데이터를 입출력할 수 있으며 외부의 충격으로부터 데이터가 손상될 가능성이 적습니다. 11 | 12 | SSD는 PD와 연결되는 **호스트 인터페이스 로직(Host Interface Logic)**과 데이터가 저장되는 **플래시 메모리(Flash Memory)**, 인터페이스와 플래시 메모리를 연결하고 제어하는 **SSD 컨트롤러(SSD Controller)**, 외부 장치와 SSD간 사이에서 버퍼 역할을 담당하는 **메모리 버퍼(Memory Buffer)**로 구성됩니다. 13 | 14 | SSD에서 데이터를 저장하고자 하는 경우 컨트롤러는 플래시 메모리의 어느 곳에 저장할지를 결정하고 플래시 메모리의 물리적은 주소를 지정한 후 데이터를 저장합니다. 이때 채널 또는 버스를 몇 개로 나누어 저장하느냐에 따라 SSD의 성능이 달라집니다. 15 | 16 | SSD는 성능 향상을 위해 호스트로부터 받은 요청을 여러 플래시 메모리에 나누어 동시에 처리할 수 있습니다. 컨트롤러에 연결된 채널은 1개 이상의 플래시 메모리와 연결되어 있으며, 하나의 낸드 플래시 메모리 칩은 1개 이상의 웨이로 구성됩니다. 한 페이지 이상의 요청을 여러 채널의 웨이에 분산 저장할 경우 요청에 대한 처리가 동시에 이루어져 전반적인 성능을 높일 수 있습니다. 17 | 18 | * 읽기 + 19 | 한번에 하나의 페이지보다 작은 크기의 데이터를 읽을 수 없습니다. 사용자가 단일 바이트 읽기를 요청하더라도 페이지를 모두 읽은 다음 사용자가 요청한 바이트만 반환합니다. 20 | * 쓰기 + 21 | SSD에서 데이터는 페이지 단위로 기록되어야 합니다. 단일 바이트를 저장하더라도 전체 페이지가 기록되어야 합니다. 22 | * 삭제 + 23 | 페이지는 덮어쓰기가 불가능하므로, 페이지는 반드시 삭제 작업을 거쳐서 상태를 전이해야 합니다. 삭제는 단일 페이지 단위로 처리될 수 없고 페이지가 포함된 블록 전체를 삭제해야 합니다. 읽기와 쓰기 명령만 데이터 액세스를 위해서 사용할 수 있으며 명령은 컨트롤러가 공간이 필요할 때 자동적으로 내부 명령을 실행해서 사용합니다. 24 | 25 | --- 26 | 27 | link:./02-2_hdd.adoc[이전: HDD] + 28 | link:./02-4_performance_storage.adoc[다음: 디스크의 성능] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/02-4_performance_storage.adoc: -------------------------------------------------------------------------------- 1 | = 디스크의 성능 2 | 3 | HDD 4 | 5 | * DBMS가 작업을 수행하려면 데이터는 주 기억장치에 있어야 함 6 | * 디스크와 주 기억장치 간의 데이터 전송 단위는 HDD의 경우 블록이므로 블록 내의 항목 중 하나만 필요한 경우라도 블록 또는 페이지의 전체 데이터가 전송되어야 함 7 | * 블록과 페이지 입출력은 데이터 위치에 좌우됨 + 8 | 접근 시간 = 탐색시간 + 회전 지연 시간 + 전송 시간 9 | 10 | SSD 11 | 12 | * HDD와는 다르게 탐색 지연 시간, 회전 지연 시간이 없이 전송 시간만 소요되므로 임의적 읽기에서도 일정한 응답 속도가 보장됨 13 | * 쓰기의 경우 비어있는 공간이 없으면 공간을 초기화하고, 이 작업 시간 동안 해당 공간에 대한 I/O 작업이 대기 상태가 됨 14 | 15 | --- 16 | 17 | 데이터가 HDD에 저장될 경우, 다음과 같은 내용을 생각해 볼 수 있습니다. 18 | 19 | 1. DBMS가 작업을 수행하려면 데이터는 주 기억장치에 있어야 함 + 20 | 2. 디스크와 주 기억장치 간의 데이터 전송 단위는 HDD의 경우 블록이므로 블록 내의 항목 중 하나만 필요한 경우라도 블록 또는 페이지의 전체 데이터가 전송되어야 함 + 21 | 3. 블록과 페이지 입출력은 데이터 위치에 좌우됨 + 22 | 접근 시간 = 탐색시간 + 회전 지연 시간 + 전송 시간 23 | 24 | HDD의 경우 데이터가 디스크에 저장되어 있는 형태에 따라 데이터베이스 연산에 영향을 미친다는 것을 알 수 있습니다. 디스크에 블록을 저장하거나 디스크에서 블록을 판독해 오는 시간은 데이터베이스 연산에 소요되는 시간의 대부분을 차지합니다. 디스크의 기하학적 기계적 특성상 이 시간을 최소화하기 위해서는 디스크 상에 데이터 레코드를 전략적으로 배치할 필요가 있습니다. 본질적으로, 만일 두 레코드가 같이 사용되는 경우가 많다면 그 두 레코드는 가까운 위치에 배치하여야 합니다. 두 레코드를 가장 가깝게 배치하는 방법은 같은 블록에 저장하는 것입니다. 다음으로 같은 트랙, 같은 실린더, 그 다음은 인접한 실린더가 됩니다. 25 | 26 | 데이터가 SSD에 저장될 경우, SSD는 HDD와는 다르게 탐색 시간, 회전 지연 시간이 없이 전송 시간만 소요되므로 임의적인 읽기에서도 일정한 응답 속도가 보장됩니다. 쓰기의 경우에는 비어있는 공간이 없으면 공간을 초기화하고, 이 작업 시간 동안 해당 공간에 대한 I/O 작업이 대기 상태가 됩니다. 27 | 28 | --- 29 | 30 | link:./02-3_ssd.adoc[이전: SSD] + 31 | link:./03-1_chapter3_disk_space_mgt.adoc[다음: Chapter 3: 디스크 공간 관리] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/03-1_chapter3_disk_space_mgt.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 3: 디스크 공간 관리 2 | 3 | DBMS 소프트웨어 구성요소의 가장 아래에는 디스크 관리자가 존재합니다. 디스크 관리자는 데이터의 단위로 페이지라는 개념을 지원하며, 페이지를 할당하고 반환하는 명령과 페이지를 판독하고 기록하는 기능을 제공합니다. 이 장에서는 디스크 공간 관리에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03-2_block.adoc[비어있는 블록의 추적 감시] 8 | 2. link:./03-3_disk_space.adoc[운영체제 파일 시스템을 이용한 디스크 공간 관리] 9 | 10 | --- 11 | 12 | link:./02-4_performance_storage.adoc[이전: 디스크의 성능] + 13 | link:./03-2_block.adoc[다음: 비어있는 블록의 추적 감시] 14 | -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/03-2_block.adoc: -------------------------------------------------------------------------------- 1 | = 비어 있는 블록의 추적 감시 2 | 3 | * 레코드를 삽입함에 따라 데이터베이스를 확장되고 축소됨 4 | * DBMS는 사용중인 디스크 블록과 어떤 블록에 존재하는지 추적 감시함 5 | * 추적 감시 6 | * 비어있는 블록들의 리스트를 유지 7 | * 디스크 블록마다 1 비트씩 블록의 사용 여부를 나타내는 비트맵을 유지 8 | 9 | --- 10 | 11 | 레코드를 삽입하고 삭제함에 따라 데이터베이스는 확장되고 축소됩니다. 디스크 관리자는 어떤 디스크 블록들이 사용중이고, 어떤 페이지가 어느 디스크 블록에 있는지를 추적 감시합니다. 12 | 13 | 데이터베이스를 사용하는 과정에서 처음에는 블록들이 디스크에 할당되겠지만 할당과 반환이 계속되면서 순차적인 구조가 무너지고 중간 중간에 공간이 생기게 됩니다. 14 | 15 | 디스크 관리자가 블록을 추적 감시하는 방법은 비어있는 블록들의 리스트를 유지하는 것입니다. 블록이 반환될 때 마다 비어있는 공간의 포인터를 리스트에 저장하여 나중에 사용할 수 있도록 합니다. 16 | 17 | 두 번째 방법은 각 디스크 블록마다 1 비트씩 블록의 사용 여부를 나타내는 비트맵을 유지하는 것입니다. 이 방법은 연속적인 디스크 공간을 빠르게 알아낼 수 있지만, 자료구조에 따라 어려울 수 있습니다. 18 | 19 | --- 20 | 21 | link:./03-1_chapter3_disk_space_mgt.adoc[이전: Chapter 3: 디스크 공간 관리] + 22 | link:./03-3_disk_space.adoc[다음: 운영체제 파일 시스템을 이용한 디스크 공간 관리] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/03-3_disk_space.adoc: -------------------------------------------------------------------------------- 1 | = 운영체제 파일 시스템을 이용한 디스크 공간 관리 2 | 3 | * 운영체제는 디스크 공간을 관리함 4 | ** 운영체제는 파일을 바이트의 순서(Sequence)로 고수준 서비스를 제공 5 | ** 고수준의 요청을 운영체제에 따른 저수준 명령어로 바꾸어 처리함 6 | * DBMS는 운영체제 파일 시스템을 바탕으로 데이터베이스를 관리하기도 함 7 | * 대부분의 DBMS는 운영체제의 파일 시스템에 의존하지 않음 8 | ** 특정 운영체제의 세부적 사양에 맞추면 다양한 운영체제에서 동작하는 DBMS를 만들기 어려움 9 | ** 운영체제는 최대 파일 크기를 제한하는 경우가 있음 10 | ** 운영체제 파일은 여러 디스크로 분할되지 못함 11 | ** 페이지 참조 패턴을 일반적인 운영체제보다 더 정확히 예측해야 함 12 | ** 페이지를 디스크에 기록하는 시점에 대해 더 많은 제어를 해 주어야 함 13 | 14 | --- 15 | 16 | 운영체제도 디스크 공간을 관리합니다. 일반적으로 운영체제는 파일을 바이트 시퀀스라는 고수준의 형태로 서비스합니다. 디스크 공간을 관리하며 고수준 명령어를 디스크의 구조에 맞는 저수준 명령어로 변경합니다. 데이터베이스 디스크 관리자는 운영체제의 파일 구조를 이용할 수 있으며, 어떤 DBMS는 운영체제의 파일 시스템을 바탕으로 데이터베이스를 관리하기도 합니다. 17 | 18 | 대부분의 DBMS는 운영체제의 파일 시스템에 의존하지 않습니다. 디스크 관리를 저수준으로 직접 수행하거나, 또는 운영체제의 기능을 확장하여 수행합니다. 개략적인 이유는 아래와 같습니다. 19 | 20 | 1. 특정 운영체제의 세부적 사양에 맞추면 다양한 운영체제에서 동작하는 DBMS를 만들기 어려움 21 | 2. 운영체제는 최대 파일 크기를 제한하는 경우가 있음 22 | 3. 운영체제 파일은 여러 디스크로 분할되지 못함 23 | 4. 페이지 참조 패턴을 일반적인 운영체제보다 더 정확히 예측해야 함 24 | 5. 페이지를 디스크에 기록하는 시점에 대해 더 많은 제어가 필요함 25 | 26 | --- 27 | 28 | link:./03-2_block.adoc[이전: 비어있는 블록의 추적감시] + 29 | link:./04-1_chapter4_buffer_manager.adoc[다음: Chapter 4: 버퍼 관리자] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/04-1_chapter4_buffer_manager.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 4: 버퍼 관리자 2 | 3 | 대부분의 데이터베이스는 주기억장치보다 큰 용량을 가집니다. CPU는 메모리에 적재된 데이터만을 처리할 수 있으므로, DBMS는 필요할 때 마다 데이터를 주 기억장치에 적재해야 하며, 언제 페이지를 교체해야 하는지를 결정해야 합니다. 버퍼 관리자는 DBMS에서 가장 중요한 구성요소 중 하나로, 필요할 때 마다 디스크로부터 페이지를 가져와서 주 기억장치에 적재할 책임이 있는 소프트웨어 계층입니다. 이 장에서는 버퍼 관리자에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./04-2_buffer_pool.adoc[버퍼 풀] 8 | 2. link:./04-3_buffer_paging.adoc[버퍼 교체 전략] 9 | 3. link:./04-4_buffer_management.adoc[버퍼 관리 기법] 10 | 11 | --- 12 | 13 | link:./03-3_disk_space.adoc[이전: 운영체제 파일 시스템을 이용한 디스크 공간 관리] + 14 | link:./04-2_buffer_pool.adoc[다음: 버퍼 풀] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/05-1_chapter5_record.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 5: 레코드 형식 2 | 3 | 주 기억장치의 예약된 공간인 버퍼 풀은 프레임이라는 페이지가 로드될 수 있는 공간을 제공하고, 버퍼 관리자는 디스크 관리자로부터 전달받은 페이지를 버퍼 풀에 로드합니다. 페이지 내의 데이터는 레코드라는 형식으로 구성됩니다. 이 장에서는 레코드의 형식에 대해 공부합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./05-2_fixed_length_record.adoc[고정 길이 레코드] 8 | 2. link:./05-3_variant_length_record.adoc[가변 길이 레코드] 9 | 10 | --- 11 | 12 | link:./04-4_buffer_management.adoc[이전: 버퍼 관리 기법 비교] + 13 | link:./05-2_fixed_length_record.adoc[다음: 고정 길이 레코드] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/05-2_fixed_length_record.adoc: -------------------------------------------------------------------------------- 1 | = 고정 길이 레코드 2 | 3 | * 각 필드의 길이가 고정적이고 필드의 수도 고정된 레코드 형식 4 | * 필드를 레코드에 연속적으로 저장 5 | 6 | image:../images/image06.png[] 7 | 8 | --- 9 | 10 | 고정 길이 레코드(Fixed-length Record)는 각 필드의 길이가 고정적이며 필드의 수가 고정되어 있습니다. 레코드의 주소가 주어지면 시스템 카탈로그에 있는 선행 필드들의 길이 정보를 이용하여 원하는 필드의 주소(위치)를 계산해 낼 수 있어 레코드들은 연속적으로 저장할 수 있습니다 11 | 12 | --- 13 | 14 | link:./05-1_chapter5_record.adoc[이전: Chapter 5: 레코드 형식] + 15 | link:./05-3_variant_length_record.adoc[다음: 가변 길이 레코드] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/05-3_variant_length_record.adoc: -------------------------------------------------------------------------------- 1 | = 가변 길이 레코드 2 | 3 | * 필드의 길이가 가변적인 경우 해당 레코드의 길이가 가변적이 됨 4 | * 필드를 분리자로 구분하여 연속적으로 저장 5 | 6 | image:../images/image07.png[] 7 | 8 | * 레코드의 앞부분에 정수로 된 오프셋들을 배열로 저장 9 | 10 | image:../images/image08.png[] 11 | 12 | --- 13 | 14 | 관계형 데이터모델에서 값은 릴레이션에 속하는 모든 레코드가 같은 수의 필드만 갖게 됩니다. 필드의 수가 같으므로, 필드의 길이가 가변적인 경우에만 레코드의 길이가 가변적이 됩니다. 15 | 16 | 가능한 조직법 중 하나는 필드를 분리자로 구분하여 연속적으로 저장하는 것입니다. 이런 조직법에서는 원하는 필드를 찾으려면 전체 레코드를 스캔해야 합니다. 17 | 18 | 다른 방법은 레코드의 앞 부분에 정수로 된 오프셋 값들을 배열로 저장해 두는 것입니다. 오프셋 배열에 따라 오버헤드가 추가되는 대신 각 필드에 직접적인 접근이 가능합니다. 또한 null 값의 확실한 처리가 가능합니다. 19 | 20 | 레코드가 가변 길이 레코드를 포함하게 되면 레코드가 수정될 때 미묘한 문제가 발생할 수 있습니다. 21 | 22 | * 필드를 수정하면서 길이가 증가할 수 있는데, 이 경우 공간을 추가 확보하기 위하여 후속 레코드들을 모두 뒤로 이동시켜야 합니다. 23 | * 수정된 레코드가 해당 페이지의 남아있는 공간에 들어가지 못하는 경우는 다른 페이지로 이동되어야 합니다. 만약 레코드를 가리키는데 사용되는 RID가 페이지 번호를 포함하고 있으면 레코드를 다른 페이지로 이동시키는 것은 문제를 야기할 수 있습니다. 24 | * 레코드가 너무 커져서 하나의 페이지에 못 들어가는 경우도 있습니다. 이 경우에는 레코드를 몇 개의 작은 레코드 조각으로 분할해서 처리해야 합니다. 25 | 26 | --- 27 | 28 | link:./05-2_fixed_length_record.adoc[이전: Chapter 5: 고정 길이 레코드] + 29 | link:./06-1_chapter6_page.adoc[다음: 페이지 형식] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/06-1_chapter6_page.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 6: 페이지 2 | 3 | 페이지는 버퍼 풀에 저장되는 레코드의 집합이며, 디스크에서 메모리로 데이터가 전송되는 최소 단위입니다. 페이지 역시 각 레코드가 저장되는 슬롯을 가지고 있으며, 각 슬롯에 레코드가 저장됩니다. 이 장에서는 페이지의 데이터 저장 형식에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./06-2_page_type.adoc[페이지 형식] 8 | 2. link:./06-3_fixed_record.adoc[고정 길이 레코드] 9 | 3. link:./06-4_variant_record.adoc[가변 길이 레코드] 10 | 11 | --- 12 | 13 | link:./05-3_variant_length_record.adoc[이전: 가변 길이 레코드] + 14 | link:./06-2_page_type.adoc[다음: 페이지 형식] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/06-2_page_type.adoc: -------------------------------------------------------------------------------- 1 | = 페이지 형식 2 | 3 | * 페이지는 레코드가 탑재되는 슬롯의 모임으로 생각할 수 있음 4 | * 레코드는 <페이지 번호, 슬롯 번호>의 쌍으로 식별됨 5 | * <페이지 번호, 슬롯 번호>의 쌍을 RID라고 하며, 레코드의 포인터 역할을 수행 6 | 7 | --- 8 | 9 | 페이지는 슬롯(Slot)의 모임으로 생각할 수 있습니다. 각 슬롯에 레코드가 하나씩 탑재됩니다. 레코드는 <페이지 번호>, <슬롯 번호>의 쌍으로 식별됩니다. 10 | 11 | <페이지 번호>, <슬롯 번호>의 쌍을 RID(Record ID)라고 하며, 레코드의 포인터 역할을 수행하게 됩니다. 12 | 13 | --- 14 | 15 | link:./06-1_chapter6_page.adoc[이전: Chapter 6: 페이지] + 16 | link:./06-3_fixed_record.adoc[다음: 고정 길이 레코드] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/06-3_fixed_record.adoc: -------------------------------------------------------------------------------- 1 | = 고정 길이 레코드 2 | 3 | * 고정 길이 레코드에만 탑재 될 경우 슬롯은 같은 형태이며, 연속적으로 배치 가능합니다. 4 | * 레코드가 페이지로 삽입될 때는 빈 슬롯을 할당하고 할당된 슬롯에 레코드를 삽입 5 | * 빈 슬롯(자유 슬롯)을 어떻게 알 수 있는지에 대한 두 가지 방법 6 | 7 | image:../images/image09.png[] 8 | 9 | --- 10 | 11 | 한 페이지에 모든 레코드가 같은 길이를 갖도록 되어 있다면, 레코드 슬롯은 단일 형태이며 페이지내에 연속적으로 배치될 수 있습니다. 12 | 13 | 버퍼 풀에 존재하는 페이지에는 여러 슬롯이 존재하고, 일부 슬롯에는 레코드가 탑재되어 있고 일부 슬롯에는 비어 있습니다. 레코드가 페이지에 삽입될 때는 빈 슬롯을 할당하고 할당된 빈 슬롯에 레코드를 삽입해야 합니다. 빈 슬롯을 페이지에 할당하기 위해서는 빈 슬롯을 알아야 하는데, 이를 어떻게 처리하느냐에 따라 두 가지 방법이 존재합니다. 이는 페이지에서 레코드가 삭제될 때 어떻게 대처하는지에 대해서와도 관련이 있습니다. 14 | 15 | == 레코드를 처음의 N 슬롯에 순서대로 배치하는 방법 16 | 17 | 첫 번째 방법은 레코드를 처음의 N 슬롯에 모아서 배치하는 것입니다. 페이지에서 레코드가 삭제되면 페이지의 마지막 레코드를 레코드가 삭제되어 비게 되는 슬롯으로 이동합니다. 이런 형식으로 페이지 내에서 간단한 오프셋 계산으로 i 번째 레코드를 알아내는 것이 가능하며, 빈 슬롯들은 모두 페이지의 마지막에 모여있게 됩니다. 이 방법은 페이지가 이동할 때 슬롯 번호가 변경되므로, 이동된 레코드에 대한 외부 참조가 있을 경우 동작하지 않습니다. 18 | 19 | == 오프셋 비트맵 사용 20 | 21 | 두 번째 방법은 빈 슬롯 정보를 추적하기 위해 슬롯마다 한 비트씩의 비트 배열을 사용하여 삭제를 처리하는 방법입니다. 페이지에 레코드를 탑재하기 위해서는 비트 배열을 스캔해서 비트가 꺼져 있는 블록을 찾습니다. 레코드가 삭제될 때 해당 비트는 꺼집니다. 22 | 23 | 페이지에서는 페이지에 탑재되어 있는 레코드에 대한 정보 이외에도 파일 내의 다음 페이지 번호 등의 정보도 포함합니다. 24 | 25 | --- 26 | 27 | link:./06-2_page_type.adoc[이전: 페이지 형식] + 28 | link:./06-4_variant_record.adoc[다음: 가변 길이 레코드] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/07-1_chapter7_file_index.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 7: 파일과 인덱스 2 | 3 | DBMS의 상위 계층 구조는 사실상 페이지를 레코드의 집단으로 취급하고 세부적인 저장 구조에 대해서는 무시합니다. 레코드는 페이지에 저장되고, 페이지는 파일에 저장됩니다. 페이지가 파일에서 조직되는 형태에 따라 데이터베이스의 성질과 속도가 달라집니다. 이 절에서는 페이지의 군집이 파일로 어떻게 조직되는지 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./07-2_heap.adoc[힙(Heap) 파일] 8 | 2. link:./07-3_index.adoc[인덱스 개요] 9 | 3. link:./07-4_isam.adoc[ISAM 파일] 10 | 4. link:./07-5_bplus_tree.adoc[B+ 트리] 11 | 12 | --- 13 | 14 | link:./06-4_variant_record.adoc[이전: 가변 길이 레코드] + 15 | link:./07-2_heap.adoc[다음: 힙(Heap) 파일] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/07-2_heap.adoc: -------------------------------------------------------------------------------- 1 | = 힙(Heap) 파일 2 | 3 | * 가장 간단한 파일 구조로, 레코드가 파일의 빈 공간에 순서 없이 저장 4 | * 페이지 내의 데이터가 어떠한 형태로도 정렬되지 않으며, 파일의 모든 레코드를 검색하면 다음 레코드를 되풀이해서 요청해야 함 5 | * 파일의 레코드는 각기 유일한 rid를 가지며, 한 파일에 속하는 페이지는 크기가 모두 같음 6 | * 파일의 생성(Create)과 제거(Destroy), 레코드의 삽입(Insert)과 rid를 통한 레코드 삭제(Delete), rid를 통한 레코드 선택(get), 파일 내의 모든 레코드 스캔(Scan) 연산 지원 7 | 8 | --- 9 | 10 | 힙(Heap) 파일은 가장 간단한 파일 구조로, 페이지 내의 데이터가 어떤 헝태로도 정렬되지 않으며, 파일의 모든 레코드를 검색하려면 다음 레코드를 되풀이해서 요청해야 합니다. 파일의 레코드는 유일한 rid를 가지며, 한 파일에 속하는 페이지는 모두 크기가 같습니다. 11 | 12 | 힙 파일에서 지원되는 연산은 파일의 생성(Create)과 제거(Destroy), 레코드의 삽입(Insert)과 rid를 통한 레코드 삭제(Delete), rid를 통한 레코드 선택(get), 파일 내의 모든 레코드 스캔(Scan) 연산 지원등입니다. rid를 주고 파일을 선택하여 가져오거나 삭제할때는 레코드 번호를 보면 해당 레코드가 있는 페이지의 번호를 알아낼 수 있습니다. 13 | 14 | 스캔 연산을 수행하려면 각 힙 파일에 속한 페이지들이 무엇인지 알고 있어야 하며, 삽입을 효율적으로 수행하려면 자유 공간이 남아있는 페이지들을 알고 있어야 합니다. 15 | 16 | --- 17 | 18 | link:./07-1_chapter7_file_index.adoc[이전: Chapter 7: 파일 조직과 인덱스] + 19 | link:./07-3_index.adoc[다음: 인덱스 개요] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/07-3_index.adoc: -------------------------------------------------------------------------------- 1 | = 인덱스 개요 2 | 3 | * 대부분의 자료 구조에서는 저장된 데이터의 rid를 직접 알 수 없음 4 | * 정렬되지 않은 자료 구조에서 동등 검색을 수행할 경우, 전체 자료 구조를 스캔해야 함 5 | * 인덱스(Index) + 6 | 선택(Selection) 조건에 맞는 rid를 구할 수 있도록 만든 보조 자료 구조 7 | 8 | image:../images/image11.png[] 9 | 10 | --- 11 | 12 | 어떤 필드의 값에 대해 같은 데이터를 검색하는 경우가 많습니다. 이때 검색하고자 하는 레코드의 rid만 구할 수 있으면 정렬되지 않은 힙과 같은 형식의 파일에서 해당 레코드를 쉽게 검색할 수 있습니다. 그렇지만 힙 파일에는 레코드의 rid를 구할 수 있는 기능이 없습니다. 이런 경우 **인덱스(Index)**를 사용할 수 있습니다. 인덱스는 **선택(Selection)** 조건에 맞는 레코드의 rid를 구할 수 있도록 만든 보조 자료구조입니다. 13 | 14 | 도서관에서 원하는 책을 어떻게 찾는지 생각해봅시다. 저자 이름이나 책 제목순으로 정렬된 인덱스 카드를 뒤져서 분류 번호를 알아낼 것입니다. 책은 분류 번호에 따라 정렬 있기 때문에 분류 번호만 알면 원하는 책이 있는 서가로 찾아갈 수 있습니다. 이런 경우 저자 이름에 대한 인덱스는 소용이 없습니다. 하나의 인덱스는 어느 특정한 종류의 탐색에 대해 속도를 높여줄 수 있는 보조 자료구조입니다. 15 | 16 | 파일에서 원하는 데이터 부분을 효율적으로 검색할 때에도 같은 방법을 적용할 수 있습니다. 구현의 관점에서 인덱스란 데이터 레코드의 요청에 대해 방향을 가리켜주는 레코드로 구성된, 또 다른 파일입니다. 인덱스마다 **탐색 키(Search Key)**가 정해져 있습니다. 탐색 키는 인덱스 구축의 기준으로 삼는, 레코드 파일에 속한 하나 이상의 필드로 이루어진 집합입니다. 전체 필드 집합의 모든 부분집합은 탐색 키가 될 수 있습니다. 인덱스가 구축된 레코드 파일을 **인덱스된 파일(Indexed File)**이라고 부르기도 합니다. 17 | 18 | --- 19 | 20 | link:./07-2_heap.adoc[이전: Heap 파일] + 21 | link:./07-4_isam.adoc[다음: ISAM 파일] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/07-5_bplus_tree.adoc: -------------------------------------------------------------------------------- 1 | = B+ 트리 2 | 3 | * ISAM의 오버 플로의 단점을 개선한 동적 트리 자료구조 4 | * 내부 노드들이 탐색 경로를 유도하고 단말 노드들이 데이터 엔트리를 가지는 균형 트리 5 | ** 트리에서 삽입, 삭제를 수행해도 트리의 균형이 유지됨 6 | ** 레코드를 탐색할 때 루트로부터 알맞은 단말 까지만 가면 됨 7 | * 일반적으로 ISAM보다 우수한 구조 8 | 9 | image:../images/image12.png[] 10 | 11 | --- 12 | 13 | ISAM 인덱스와 같은 정적인 구조는 파일이 커짐에 따라 긴 오버 플로우 체인이 생겨 성능 저하를 일으키는 문제를 가지고 있습니다. 이런 문제 때문에 삽입과 삭제에서도 깔끔하게 조정되는 좀 더 융통성 있고 동적인 구조를 개발할 필요가 생겼습니다. 14 | 15 | B+ 트리는 실제에서 널리 쓰이는 구조로, 내부 노드들이 탐색 경로를 유도하고 단말 노드들이 데이터 엔트리를 가지는 균형 트리입니다. 트리가 동적으로 커지고 작아지기 때문에 정적인 ISAM에서 처럼 단말 노드의 페이지에 대해 순차적으로 공간을 할당해주는 것은 어렵습니다. 16 | 17 | B+ 트리의 주요 특징은 다음과 같습니다. 18 | • 트리에서 삽입, 삭제를 수행해도 트리의 균형이 유지됨 19 | • 파일은 일반적으로 축소보다는 확장되므로 삭제시에 파일을 축소시키지 않음 20 | • 레코드를 탐색할 때는 루트로부터 알맞은 단말까지만 가면 됨. 루트로부터 단말까지 이르는 경로의 길이를 높이라고 하는데, 균형 트리이므로 어느 단말이든 이 값은 같음 21 | 22 | 레코드의 파일이 자주 갱신되며 정렬된 접근이 중요하다면 데이터 엔트리로 레코드를 저장한 B+ 트리 인덱스를 이용하는 것이 정렬 파일을 이용하는 것 보다 성능이 우수합니다. 인덱스 엔트리를 저장하기 위한 공간 오버헤드 대신 정렬 파일의 정점과 효과적인 삽입, 삭제 알고리즘의 장점을 모두 얻게 됩니다. B+ 트리는 일반적으로 67% 정도의 공간을 채웁니다. B+ 트리에서는 삽입할 때 오버 플로우 체인을 사용하지 않고 처리하므로 ISAM 보다 효율이 좋습니다. 데이터 집합의 크기와 분포가 대체로 정적이어서 오버 플로우 체인이 많지 않다면, 그리고 잠금 관점에서 ISAM이 좋은 경우도 있으나 일반적으로 B+ 트리가 ISAM보다 우수하다고 평가됩니다. 23 | 24 | --- 25 | 26 | link:./07-4_isam.adoc[이전: ISAM 파일] + 27 | link:./08-1_chapter8_system_cat.adoc[다음: Chapter 8: 시스템 카탈로그] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/08-1_chapter8_system_cat.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 8: 시스템 카탈로그 2 | 3 | 데이터베이스 시스템의 근본적인 성질 중 하나는 자신이 가지고 있는 모든 데이터에 대한 설명 정보를 유지 관리한다는 것입니다. 이런 정보를 저장하고 있는 데이터베이스를 시스템 카탈로그라고 합니다. 이 장에서는 시스템 카탈로그에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./08-2_system_catalog.adoc[시스템 카탈로그] 8 | 9 | --- 10 | 11 | link:./07-5_bplus_tree.adoc[이전: B+ 트리] + 12 | link:./08-2_system_catalog.adoc[다음: 시스템 카탈로그] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/contents/99_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 기억장치 계층 구조 4 | * 디스크 5 | * 디스크 공간 관리 6 | * 버퍼 관리자 7 | * 레코드 형식 8 | * 페이지 형식 9 | * 파일과 인덱스 10 | * 시스템 카탈로그 11 | 12 | --- 13 | 14 | == Quiz 15 | 16 | 1. 디스크와 테이브의 가장 중요한 차이점은 무엇입니까? 17 | 2. 탐구 시간, 회전 지연시간, 전송 시간에 대해 설명하세요. 18 | 3. HDD와 SSD의 차이를 원하는 페이지에 접근하는데 소요되는 시간의 차이에서 설명하세요. 19 | 4. 순차적인 스캔이 일어나는 대규모의 파일이 있을 때 디스크에 페이지를 어떻게 저장하는지 설명하세요. 20 | 5. 버퍼 관리자가 페이지의 판독 요청을 수행하기 위해서 해야 할 일을 설명하세요. 요청된 페이지가 버퍼 풀에 있지만 사용중이 아니라면 어떻게 됩니까? 21 | 6. 버퍼 관리자가 페이지를 디스크에 기록하는 때는 언제입니까? 22 | 7. 페이지가 버퍼 풀에 핀 되었다는 의미는 무엇입니까? 23 | 8. 버퍼 풀에 있는 모든 슬롯의 dirty 비트가 켜져 있을 때 페이지 요구가 발생하면 어떻게 됩니까? 24 | 9. 일반적인 운영체제의 가상 메모리가 지원하지 않는 DBMS 버퍼 관리자의 중요한 기능을 설명하세요. 25 | 10. 페이지 선반입이란 무엇입니까? 26 | 11. 두 가지 레코드 형식을 설명하세요. 27 | 12. 두 가지 페이지 형식을 설명하세요. 28 | 29 | --- 30 | 31 | link:./08-lab3d.adoc[이전: Lab 3d: 테이블 생성(Postgres)] -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image01.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image02.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image03.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image04.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image05.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image06.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image07.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image08.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image09.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image10.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image11.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image12.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image13.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image14.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image15.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image16.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image17.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image18.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image19.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image20.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image21.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image22.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image23.png -------------------------------------------------------------------------------- /course/Module03_disk_and_file/images/image24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module03_disk_and_file/images/image24.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/00_file_and_index.adoc: -------------------------------------------------------------------------------- 1 | = Module 04: 파일 조직과 인덱스 2 | 3 | 파일 조직은 파일이 디스크에 저장되어 있을 때 레코드를 파일에 배치하는 방법입니다. 레코드들로 이루어지는 파일은 다양한 방식으로 접근되고 수정됩니다. DBMS는 여러가지의 파일 조직법을 지원하는데, 효율적인 데이터베이스 사용을 위해서는 각각의 파일에 대해 사용되는 패턴을 파악하여 효율적인 파일 조직을 선택하는 것입니다. 이 모듈에서는 파일 조직과 인덱스에 대해 학습합니다. 4 | 5 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 6 | • 힙 파일, 정렬 파일, 해시 파일에 대한 파일 조직법을 설명할 수 있습니다. 7 | • 패턴에 따라 효율적인 파일 조직을 선택할 수 있습니다. 8 | • 인덱스와 인덱스 조직에 대해 설명할 수 있습니다. 9 | 10 | == Table of Contents 11 | 12 | 1. link:./01-1_chapter1_cost_file.adoc[비용 모델과 파일 조직법] 13 | 2. link:./02-1_chapter2_index.adoc[인덱스] 14 | 15 | --- 16 | 17 | link:./02_chapter1_cost_file.adoc[다음: Chapter 1: 비용 모델과 파일 조직법] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/01-1_chapter1_cost_file.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: 비용 모델과 파일 조직법 2 | 3 | 데이터베이스는 질의(쿼리)가 요청될 때 여러 실행 계획을 세우고 비교하여 최적화된 방법으로 쿼리를 실행합니다. 최적화된 방법을 찾아내는 여러 방법들이 있으며, 비용 모델은 가장 많이 쓰이는 방법입니다. 이 단원에서는 데이터베이스에서 질의가 생성될 때 파일 조직에 따른 비용을 계산하여 최적화된 방법을 찾는 방법에 대해 공부합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./01-2_cost_model.adoc[비용 모델 개요] 8 | 2. link:./01-3_file_org.adoc[파일 조직법 개요] 9 | 3. link:./01-4_heap_file.adoc[힙 파일] 10 | 4. link:./01-5_sorted_file.adoc[정렬 파일] 11 | 5. link:./01-6_hash_file.adoc[해시 파일] 12 | 6. link:./01-7_file_choice.adoc[파일 조직 선택] 13 | 14 | --- 15 | 16 | link:./00_file_and_index.adoc[이전: Module 04: 파일 조직과 인덱스] + 17 | link:./01-2_cost_model.adoc[다음: 비용 모델 개요] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/01-2_cost_model.adoc: -------------------------------------------------------------------------------- 1 | = 비용 모델 개요 2 | 3 | * 데이터베이스에서는 질의가 요청될 때 여러 실행계획을 세우고 최적화된 방법을 찾아 실행 4 | * 쿼리 최적화기는 쿼리 기반, 비용 기반 등의 모델로 실행 계획을 비교 5 | * 비용 측정 6 | ** 데이터 페이지의 개수 B, 페이지에 속한 레코드의 개수 R, 디스크 페이지를 하나를 읽는 시간을 D로 가정 7 | ** 디스크 페이지 하나를 쓰는데 걸리는 평균 시간 D, 한 레코드를 처리하는데 걸리는 시간 C 8 | ** 한 레코드에 해시 함수를 적용하는데 걸리는 시간 H 9 | * 여기에서는 파일 입출력 비용만 감안하여 파일 조직 별 비용을 비교 10 | 11 | --- 12 | 13 | 데이터베이스 관리 시스템은 질의가 요청될 때 여러 실행 계획을 세우고 비교하여 최적화된 방법을 찾아 실행합니다. 이때 실행 계획을 세우고 비교하여 최적화된 방법을 찾아내는 DBMS 구성 요소를 **질의 최적화기(Query Optimizer)**라고 부릅니다. SQL 언어로 결과 집합을 요구하면 결과집합을 찾는 처리 경로는 질의 최적화기가 생성하며, 생성한 처리 계획을 실행 계획이라고 부릅니다. 14 | 15 | 질의 최적화기는 두 가지로 나눌 수 있습니다. 16 | 17 | * 규칙 기반 옵티마이저(Rule-Based Optimizer) + 18 | 휴리스틱 옵티마이저라고도 불리며, 미리 정해놓은 규칙에 따라 액세스 경로를 평가하고 실행 계획을 선택합니다. 규익은 액세스 경로별 우선순위로서, 인덱스 구조, 연산자, 조건절 형태가 순위를 결정짓는 주요 요인입니다. 19 | * 비용기반 옵티마이저(Cost-Based Optimizer) + 20 | 쿼리를 수행하는데 소요되는 일의 양 또는 시간을 기반으로 최적화된 실행 경로를 계산합니다. 미리 구해놓은 테이블과 인덱스에 대한 통계정보를 기초로 각 실행 단계별 예상 비용을 산정하고, 이를 합산한 비용이 가장 낮은 실행 계획을 선택합니다. 레코드 개수, 블록 개수, 평균 행 길이, 컬럼 값의 수, 컬럼 값 분포등을 사용하며 하드웨어적인 특성인 CPU 속도, 디스크 I/O 속도 등을 사용합니다. 대부분의 RDBMS는 비용기반 쿼리 옵티마이저를 채택합니다. 21 | 22 | 이 장에서는 여러 감안 요소 중 파일 조직별 비용을 알아보기 위해 파일 조직별 입출력 비용만 감안하여 파일 조직별 비용을 비교합니다. 23 | 24 | * B: 데이터 페이지의 개수 25 | * R: 페이지에 속한 레코드의 개수 26 | * D: 디스크 페이지를 하나를 읽는 시간 27 | * C: 한 레코드를 처리하는데 걸리는 시간 28 | * H: 한 레코드에 해시 함수를 적용하는데 걸리는 시간 29 | 30 | --- 31 | 32 | link:./01-1_chapter1_cost_file.adoc[이전: Chapter 1: 비용 모델과 파일 조직법] + 33 | link:./01-3_file_org.adoc[다음: 파일 조직법 비교 기준 연산] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/01-3_file_org.adoc: -------------------------------------------------------------------------------- 1 | = 파일 조직법 비교 기준 연산 2 | 3 | * 스캔(Scan) + 4 | 파일에 있는 모든 레코드를 가져옴. 파일에 있는 페이지들은 디스크로 부터 버퍼 풀로 반입 되어야함 5 | * 동등 셀렉션(Equality Selection) + 6 | 질의에서 요구하는 검색어와 같은 문자열임을 만족하는 모든 레코드를 가져옴 7 | * 범위 셀렉션(Range Selection) + 8 | 1에서 10까지, 홍길동에서 이순신까지 등 범위에 해당하는 모든 레코드를 가져옴 9 | * 삽입(Insertion) + 10 | 주어진 레코드를 파일에 삽입 11 | * 삭제(Deletion) + 12 | RID로 명세된 레코드 삭제. 13 | 14 | --- 15 | 16 | 세 가지의 기본적인 파일 조직, 힙, 정렬된 파일, 해시 파일에 대해 대표적인 연산들의 비용을 비교합니다. 비교에 사용할 대표적인 데이터베이스 연산들은 다음과 같습니다. 17 | 18 | * 스캔(Scan) + 19 | 파일에 있는 모든 레코드를 가져옵니다. 파일에 있는 페이지들은 디스크로부터 버퍼 풀로 로드되어야 합니다. 20 | * 동등 셀렉션(Equality Selection) + 21 | 질의에서 요구하는 검색어와 같은 문자열임을 만족하는 모든 레코드를 버퍼 풀로 로드합니다. “이름이 이순신인 모든 레코드”와 같은 질의가 이에 해당합니다. 조건을 만족하는 레코드가 포함된 모든 페이지를 로드한 후 페이지 내에서 원하는 레코드로 이동합니다. 22 | * 범위 셀렉션(Range Selection) + 23 | 질의에서 요구하는 범위에 해당하는 모든 레코드를 버퍼 풀로 로드합니다. “고객 번호가 10000에서 100000 사이의 모든 고객”이나 “이름이 이순신에서 홍길동 사이의 모든 고객”등의 질의가 여기에 해당합니다. 24 | * 삽입(Insertion) + 25 | 주어진 레코드를 파일에 삽입합니다. 먼저 새로운 레코드가 삽입될 페이지를 알아내고 디스크로부터 해당 페이지를 로드한 후, 새로운 레코드가 포함하도록 수정하여 페이지를 저장합니다. 26 | * 삭제(Deletion) + 27 | RID로 명세된 레코드를 삭제합니다. 해당 레코드가 있는 페이지를 알아내고 메모리로 로드한 후, 수정하여 저장합니다. 28 | 29 | --- 30 | 31 | link:./01-2_cost_model.adoc[이전: 비용 모델 개요] + 32 | link:./01-4_heap_file.adoc[다음: 힙(Heap) 파일] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/01-4_heap_file.adoc: -------------------------------------------------------------------------------- 1 | = Heap 파일 2 | 3 | * 정렬되지 않은 단순한 형태의 파일 4 | * 스캔 B(D+RC) 5 | * 동등 셀렉션 6 | 후보 키에 대한 연산일 경우 0.5B(D+RC). 후보 키가 아닌 경우 스캔과 동일 7 | * 범위 셀렉션 8 | 스캔과 동일 9 | * 삽입 10 | 레코드가 항상 파일의 끝에 삽입된다고 가정할 경우 2D+C 11 | * 삭제 12 | 탐색 비용 + C + D 13 | 14 | --- 15 | 16 | Heap 파일은 정렬되지 않은 가장 단순한 형태의 파일입니다. 기본 순서 없이 저장되는 구조이며, 데이터가 Heap에 삽입되면 페이지가 어디에 기록되는지 확인할 방법이 없고, 해당 페이지가 테이블에 기록되거나 유지 관리가 수행될 때 동일한 순서로 유지된다는 보장도 없습니다. 17 | 18 | 논리적으로 Heap은 Heap 내의 모든 페이지를 가리키는 IAM(Index Allocation Map)으로 구성됩니다. 각 페이지에는 기록되는 만큼의 데이터 row가 포함됩니다. Heap 내에서는 페이지간의 연결이나 구성이 없으며, 모든 읽기 및 쓰기는 IAM을 참조한 다음 Heap내의 페이지를 읽습니다. 19 | 20 | Heap 파일에서 각각의 연산에 대한 비용은 아래와 같이 계산됩니다. 21 | 22 | * 스캔 + 23 | B의 페이지를 각각 검색해야 하는데 페이지 당 D의 시간이 소요되며, 각각의 페이지에 대해 R개의 레코드를 처리해야 하는데 레코드 당 C의 시간이 소요되기 때문에 총 비용은 B(D+RC)입니다. 24 | * 동등 셀렉션 + 25 | 검색하고자 하는 조건이 후보 키 중의 하나여서 연산의 결과가 하나의 레코드임이 보장된다면 평균적으로 파일의 절반을 스캔하는 시간이 필요합니다. 그리고 검색된 데이터 페이지마다 그 안에 들어있는 모든 레코드에 대해 해당 레코드인지 검사하는 작업이 필요합니다. 이 경우 비용은 0.5B(D+RC)입니다. 26 | 후보 키가 아닌 필드에 대한 셀렉션인 경우에는 스캔과 동일합니다. 27 | * 범위 셀렉션 + 28 | 조건에 맞는 레코드들이 파일 전체에 걸쳐 여러 개가 존재할 수 있으므로 항상 파일 전체를 스캔해야 합니다. 비용은 B(D+RC)입니다. 29 | * 삽입 + 30 | 레코드가 항상 파일의 끝에 삽입된다고 가정할 때, 파일의 마지막 페이지를 로드해서 레코드를 추가하고 저장해야 합니다. 비용은 2D+C입니다. 31 | * 삭제 + 32 | 먼저 레코드를 찾고 해당 페이지에서 레코드를 삭제한 후, 수정된 페이지를 다시 저장해야 합니다. 비용은 탐색 비용에 C+D를 더한 것과 같습니다. 33 | 34 | --- 35 | 36 | link:./01-3_file_org.adoc[이전: 파일 조직법 비교 기준 연산] + 37 | link:./01-5_sorted_file.adoc[다음: 정렬 파일] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/01-6_hash_file.adoc: -------------------------------------------------------------------------------- 1 | = 해시 파일 2 | 3 | * 특정 필드를 기준으로 정렬된 파일 4 | * 스캔 + 5 | 힙 파일과 다르지 않음. B(D+RC) 6 | * 동등 셀렉션 + 7 | 정럴 기준 필드로 검색할 경우 이진 탐색으로 Dlog2B + Clog2R. 정렬 필드가 아닌 경우 스캔과 동일 8 | * 범위 셀렉션 + 9 | 정렬 기준 필드로 검색할 경우 첫 레코드를 찾는데 동등 셀렉션과 동일. 이후 범위내 스캔 10 | * 삽입 + 11 | 정렬 순서를 유지하기 위해 레코드가 삽입될 위치를 검색 후 레코드 추가. 후속 페이지를 모두 로드하여 다시 저장. 탐색 비용 + B(D + RC) 12 | 13 | --- 14 | 15 | 해시 파일은 파일의 특정 필드로 된 탐색키를 가지고 해시 함수를 사용해 키를 찾는 파일입니다. 해시 파일을 구성하는 페이지들은 버킷(Bucket) 단위로 묶이고 레코드가 속하게 될 버킷은 해시 함수(Hash Function)를 적용해서 결정할 수 있습니다. 16 | 17 | * 스캔 + 18 | 해시 파일에서는 삽입을 위한 여분의 공간을 남겨 파일이 확장될 때 오버플로우의 수를 줄이기 위해 페이지를 보통 80% 정도 차도록 유지합니다. 레코드들을 초기에 해시 파일 구조로 조직하고 나면 기존 페이지가 80%가 찼을 때 해당 버킷에 새로운 페이지 하나를 추가하게 됩니다. 기존 페이지 수와 모든 데이터 페이지의 스캔 비용은 힙 파일의 1.25배가 되어 1.25B(D + RC)가 됩니다. 19 | * 동등 셀렉션 + 20 | 셀렉션 조건이 해시 파일의 탐색 키에 대한 것이라면 다른 파일 조직과 비교하여 효율적으로 수행됩니다. 검색 대상 레코드들이 있는 페이지를 알아내는 비용이 그 버킷이 하나의 페이지만으로 구성되어 있다고 가정할 때 H가 되고, 그 페이지를 검색하는 비용은 D가 됩니다. 찾은 페이지에서 레코드를 찾기 위해 평균 50%의 페이지를 스캔해야 한다고 하면, 비용은 H + D + RC가 됩니다. 21 | 검색 조건이 해시 파일의 탐색 키가 아니라면 스캔과 같습니다. 22 | * 범위 셀렉션 + 23 | 해시 구조는 범위 연산에서 어떠한 효율도 발하지 못합니다. 스캔과 같습니다. 24 | * 삽입 + 25 | 적절한 페이지를 찾아서 다시 기록해야 합니다. 비용은 탐색비용 + C + D입니다. 26 | * 삭제 + 27 | 레코드를 찾아서 해당 페이지에서 제거한 후, 수정한 페이지를 다시 기록해야 합니다. 탐색 비용 + C + D가 됩니다. 28 | 29 | --- 30 | 31 | link:./01-5_sorted_file.adoc[이전: 정렬 파일] + 32 | link:./01-7_file_choice.adoc[다음: 퍄일 조직 선택] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/01-7_file_choice.adoc: -------------------------------------------------------------------------------- 1 | = 파일 조직 선택 2 | 3 | image:../images/image01.png[] 4 | 5 | --- 6 | 7 | * 힙 파일은 저장 성능이 우수하고 스캔, 삽입, 삭제 연산이 빠르지만 탐색은 느립니다. 8 | * 정렬 파일은 저장 성능이 우수하고, 삽입과 삭제 연산이 느리지만 탐색은 대단히 빠릅니다. 9 | * 해시 파일은 저장 성능이 떨어지지만, 삽입과 삭제가 빠르며 동등 탐색에서 대단히 우수합니다. 하지만 범위 탐색은 지원하지 못하며 스캔 성능이 떨어집니다. 10 | 11 | --- 12 | 13 | link:./01-6_hash_file.adoc[이전: 해시 파일] + 14 | link:./02-1_chapter2_index.adoc[다음: Chapter 2: 인덱스] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/02-1_chapter2_index.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: 인덱스 2 | 3 | 인덱스는 해당 파일의 기본적인 레코드 조직법으로는 효율적으로 지원되지 않는 연산의 속도를 높이기 위한 보조 자료구조입니다. 이 장에서는 인덱스에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./02-2_index_overview.adoc[인덱스 개요] 8 | 2. link:./02-3_clustered_index.adoc[클러스터드 인덱스] 9 | 3. link:./02-4_nonclustered_index.adoc[넌 클러스터드 인덱스] 10 | 4. link:./02-5_sparse_index.adoc[밀집 인덱스와 희소 인덱스] 11 | 5. link:./02-6_primary_index.adoc[기본 인덱스와 보조 인덱스] 12 | 6. link:./02-7_composite_index.adoc[복합 인덱스] 13 | 14 | --- 15 | 16 | link:./01-7_file_choice.adoc[이전: 파일 조직 선택] + 17 | link:./02-2_index_overview.adoc[다음: 인덱스 개요] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/02-2_index_overview.adoc: -------------------------------------------------------------------------------- 1 | = 인덱스 개요 2 | 3 | * 해당 파일의 기본적인 레코드 조직법으로는 효율적으로 지원되지 않는 연산의 속도를 높이기 위해 만드는 보조적인 자료구조 4 | * 데이터 엔트리(Data Entry)들의 모임 5 | 6 | image:../images/image02.png[] 7 | 8 | --- 9 | 10 | 인덱스란 해당 파일의 기본적인 레코드 조직법으로는 효율적으로 지원되지 않는 연산의 속도를 높이기 위해 사용되는 보조적인 구조를 말합니다. 11 | 12 | 인덱스는 데이터 엔트리(Data Entry)들의 모임으로도 볼 수 있는데, 탐색 키에 해당하는 모든 데이터 엔트리들의 위치를 찾을 수 있도록 정렬해 두었기 때문입니다. 인덱스의 데이터 엔트리 k*는 파일의 탐색 키 값 k와와 rid 정보가 들어 있습니다. 한 릴레이션의 탐색 키가 name 필드이고 그 릴레이션의 빠른 연산을 돕기 위한 인덱스가 생성되었다면 인덱스의 데이터 엔트리는 로 구성됩니다. 인덱스의 데이터 엔트리는 파일의 한 레코드를 가리키는 포인터라고 볼 수 있습니다. 13 | 14 | --- 15 | 16 | link:./02-1_chapter2_index.adoc[이전: Chapter 2: 인덱스] + 17 | link:./02-3_clustered_index.adoc[다음: 클러스터드 인덱스] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/02-3_clustered_index.adoc: -------------------------------------------------------------------------------- 1 | = 클러스터드 인덱스 2 | 3 | * 파일을 조직할 때 레코드의 순서를 파일에 대한 인덱스의 순서와 동일한 순서로 유지 4 | * 파일의 재조직이 필요한 구조 5 | * 데이터가 삽입/삭제될 때 마다 정렬 순서를 유지하기 위해서 그 주변의 데이터를 이동해야 함 6 | * 파일이 동적으로 변하는 경우 유지 관리 오버헤드가 높음 7 | 8 | image:../images/image03.png[] 9 | 10 | --- 11 | 12 | 파일을 조직할 때 데이터 레코드의 순서를 그 파일에 대한 어떤 인덱스의 데이터 엔트리 순서와 동일하거나 비슷하도록 조직된 인덱스를 클러스터드 인덱스(Clustered Index)라고 합니다. 13 | 14 | 클러스터드 인덱스에서는 인덱스 엔트리들을 트리 구조로 조직하며 단말 노드 층을 따라 데이터 엔트리들을 탐색해 나가면 정렬된 순서로 볼 수 있도록 해 줍니다. 15 | 16 | 클러스터드 인덱스에서는 데이터가 삽입되거나 삭제될 때 마다 정렬 순서를 유지하기 위해서 그 주번의 레코드를 움직여야 합니다. 보통은 처음에 레코드를 정렬해 놓은 다음, 차후의 삽입에 대비해 각각의 페이지마다 약간씩의 여유 공간을 남겨둡니다. 페이지에 남은 여유 공간이 모두 소진되면 오버 플로우 페이지를 리스트로 이어 붙여 대처합니다. 이 경우 파일을 재조직 해야 합니다. 17 | 18 | 클러스터드 인덱스는 파일이 동적으로 변하는 경우 유지 관리 비용이 비교적 높습니다. 클러스터드 인덱스 유지 비용이 높은 다른 이유 중 하나는 데이터 엔트리들이 이 페이지에서 저 페이지로 움직여야 하는 경우가 있는데, 레코드 식별자를 페이지 번호와 슬롯 번호의 조합으로 만든다면 그 이동된 레코드를 가리키던 모든 요소들도 새로운 위치를 가리키도록 갱신해야 하기 때문입니다. 19 | 20 | --- 21 | 22 | link:./02-2_index_overview.adoc[이전: 인덱스 개요] + 23 | link:./02-4_nonclustered_index.adoc[다음: 넌 클러스터드 인덱스] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/02-4_nonclustered_index.adoc: -------------------------------------------------------------------------------- 1 | = 넌 클러스터드 인덱스 2 | 3 | * 하나의 데이터 파일은 하나의 탐색키에 대해서만 클러스터링 될 수 있음 4 | * 하나의 데이터 파일에 대해 하나의 클러스드 인덱스만 만들 수 있음 5 | * 클러스터드 인덱스 구조 파일의 키가 아닌 필드의 빠른 검색을 위한 보조 자료구조 6 | 7 | image:../images/image04.png[] 8 | 9 | --- 10 | 11 | 하나의 데이터 파일은 하나의 탐색 키에 대해서만 클러스터링 될 수 있습니다. 즉, 하나의 데이터파일에는 하나의 클러스터드 인덱스만 만들 수 있습니다. 클러스터드 인덱스의 형태가 아닌 인덱스를 **넌 클러스터드 인덱스(Non-clustered Index)**라고 합니다. 12 | 13 | 넌 클러스터스 인덱스는 인덱스는 데이터 엔트리 파일에 여러 개를 만들 수 있습니다. 14 | 15 | 인덱스를 사용하여 범위 탐색 질의를 수행하는 비용은 그 인덱스가 클러스터드 인덱스인지 아닌지에 따라 달라집니다. 클러스터드 인덱스라면 데이터 엔트리에 나타나 있는 rid는 연속된 레코드 집합을 가지게 되므로 몇 개의 페이지만 검색하면 됩니다. 넌 클러스터드 인덱스라면 데이터 rid들은 서로 다른 데이터 페이지들을 가지게 되므로, 범위 탐색에 해당하는 데이터 엔트리의 수만큼의 데이터 입출력 작업이 필요하게 됩니다. 16 | 17 | --- 18 | 19 | link:./02-3_clustered_index.adoc[이전: 클러스터드 인덱스] + 20 | link:./02-5_sparse_index.adoc[다음: 밀집 인덱스와 희소 인덱스] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/02-5_sparse_index.adoc: -------------------------------------------------------------------------------- 1 | = 밀집 인덱스와 희소 인덱스 2 | 3 | * 밀집 인덱스(Dense Index) 4 | ** 파일에 있는 모든 탐색 키 값에 대해 데이터 엔트리를 구성 5 | * 희소 인덱스(Sparse Index) 6 | ** 데이터 파일의 페이지별로 하나의 데이터 엔트리를 구성 7 | 8 | image:../images/image05.png[] 9 | 10 | --- 11 | 12 | 인덱스 된 파일의 레코드에 나타나는 탐색 키 값 모두에 하나씩의 엔트리를 구성해 놓는 인덱스를 **밀집 인덱스(Dense Index)**라고 하고, 데이터 파일의 페이지 별로 하나의 엔트리를 구성하는 인덱스를 **희소 인덱스(Sparse Index)**라고 합니다. 13 | 14 | 희소 인덱스가 넌 클러스터드 인덱스인 경우는 없습니다. 따라서, 희소 인덱스는 하나 밖에 만들 수 없습니다. 희소 인덱스는 보통 밀집 인덱스보다 크기가 작습니다. 하지만 유용한 최적화 기법에는 밀집 인덱스를 사용하는 경우가 많습니다. 15 | 16 | 한 데이터 파일의 한 필드에 밀집 인덱스가 존재하면, 이때 데이터 파일이 **도치(Inverted)**되었다고 합니다. **완전 역 파일(Fully inverted file)**은 기본 키에 속하지 않은 모든 필드마다 밀집 보조 인덱스를 하나씩 만들어 놓은 파일을 말합니다. 17 | 18 | --- 19 | 20 | link:./02-4_nonclustered_index.adoc[이전: 넌 클러스터드 인덱스] + 21 | link:./02-6_primary_index.adoc[다음: 기본 인덱스와 보조 인덱스] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/02-6_primary_index.adoc: -------------------------------------------------------------------------------- 1 | = 기본 인덱스와 보조 인덱스 2 | 3 | * 기본 키를 포함한 필드들에 대한 보조 인덱스를 기본 인덱스라고 부름 4 | ** 기본 키가 존재하는 테이블은 기본 키가 클러스터드 인덱스가 되고 해당 자료구조로 테이블을 조직하는 DBMS도 있음 5 | ** 기본 키를 희소, 클러스터드 인덱스로 지정하는 DBMS도 있음 6 | * 기본 키 이외의 인덱스들을 보조 인덱스로 부름 7 | ** 동일한 탐색 키 필드에 대해 데이터 엔트리가 두 개 존재하는 경우 중복되었다고 함 8 | ** 키 필드가 아닌 필드에 대한 인덱스에는 중복이 나타날 수 있음 9 | * 해당 탐색 키에 후보 키가 포함되는 경우, 그 키에 대한 인덱스를 유일 인덱스라고 부름 10 | 11 | --- 12 | 13 | 기본 키를 포함하는 필드들에 대한 인덱스를 **기본 인덱스(Primary Index)**라고 기본 인덱스 이외의 인덱스 이외의 인덱스들을 **보조 인덱스(Secondary Index)**라고 합니다. 14 | 15 | 일부 DBMS는 테이블에 **기본 키(Primary Key)**가 지정되면 기본 키를 기준으로 클러스터드 인덱스를 만들고 해당 자료구조를 사용하여 테이블의 파일을 조직합니다. 또 다른 DBMS의 경우 기본 키를 희소, 클러스터드 인덱스로 기본 지정합니다. 16 | 17 | 인덱스에서 동일한 탐색 키 필드에 대한 데이터 엔트리가 두 개 존재하면 이것을 **중복(duplicated)**되었다고 말합니다. 기본 키는 중복이 발생할 수 없지만, 기본 키가 아닌 필드 집합에는 중복이 나타날 수 있습니다. 따라서 보조 인덱스의 데이터 엔트리는 중복된 값이 존재할 수 있습니다. 해당 탐색 키에 후보 키가 포함되면, 해당 탐색 키에 대해 만들어진 인덱스를 **유일 인덱스(Unique Index)**라고 합니다. 18 | 19 | --- 20 | 21 | link:./02-5_sparse_index.adoc[이전: 밀집 인덱스와 희소 인덱스] + 22 | link:./02-7_composite_index.adoc[다음: 복합 키 인덱스] 23 | -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/02-7_composite_index.adoc: -------------------------------------------------------------------------------- 1 | = 복합 키 인덱스 2 | 3 | * 인덱스가 여러 개의 필드를 포함하는 경우 복합 키(Composite Key) 또는 접합 키(Concatenated Key)라고 부름 4 | * 데이터 조직과 쿼리 형태에 따라 높은 성능을 보임 5 | 6 | --- 7 | 8 | 복합키 인덱스(Composite Index)는 두 개 이상의 컬럼을 조합하여 생성한 인덱스를 의미합니다. 단일 컬럼 인덱스(Single-column Index)와 달리 여러 개의 컬럼을 포함하여 특정 조건의 검색 성능을 향상시키는데 사용됩니다. 9 | 10 | --- 11 | 12 | link:./02-6_primary_index.adoc[이전: 기본 인덱스와 보조 인덱스] + 13 | link:./02-lab4a.adoc[다음: Lab 4a: 인덱스 생성(MySQL)] -------------------------------------------------------------------------------- /course/Module04_file_and_index/contents/99_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 비용 모델 개요 4 | * 파일 조직법 비교 기준 연산 5 | * 힙 파일 6 | * 정렬 파일 7 | * 해시 파일 8 | * 파일 조직 선택 9 | 10 | --- 11 | 12 | == Quiz 13 | 1. 세 파일 조직법에 대한 논의로 내릴 수 있는 주된 결론을 설명하세요. 14 | 2. 동등 셀렉션 조건을 이용한 삭제를 수행할 때, 해당 레코드가 없다면 비용은 어떻게 되는지 설명하세요. 15 | 3. 어떤 파일에 대해 자주 적용되는 연산이 아래와 같을 때, 어떤 파일 조직법을 사용할 것인지 설명하세요. 16 | A. 필드 값의 범위에 의한 탐색 17 | B. 레코드의 순서가 중요하지 않은 삽입과 스캔 작업을 수행 18 | C. 특정한 필드 값에 의한 탐색 19 | 4. 다음 용어에 대해 설명하세요. 20 | A. 기본 인덱스와 보조 인덱스 21 | B. 클러스터드 인덱스와 넌 클러스터드 인덱스 22 | C. 밀집 인덱스와 희소 인덱스 23 | 24 | --- 25 | 26 | link:./02-lab4d.adoc[이전: Lab 4d: 인덱스 생성(Postgres)] -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image01.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image02.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image03.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image04.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image05.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image06.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image07.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image08.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image09.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image10.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image11.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image12.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image18.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image19.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image20.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image21.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image22.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image23.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image24.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image25.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/images/image26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module04_file_and_index/images/image26.png -------------------------------------------------------------------------------- /course/Module04_file_and_index/readme.adoc: -------------------------------------------------------------------------------- 1 | link:./contents/0_file_and_index.adoc[Module 04 파일 조직과 인덱스] 2 | 3 | * link:./contents/01-1_chapter1_cost_file.adoc[Chapter 1: 비용 모델과 파일 조직법] 4 | ** link:./contents/01-2_cost_model.adoc[비용 모델 개요] 5 | ** link:./contents/01-3_file_org.adoc[파일 조직법 개요] 6 | ** link:./contents/01-4_heap_file.adoc[힙 파일] 7 | ** link:./contents/01-5_sorted_file.adoc[정렬 파일] 8 | ** link:./contents/01-6_hash_file.adoc[해시 파일] 9 | ** link:./contents/01-7_file_choice.adoc[파일 조직 선택] 10 | * link:./contents/02-1_chapter2_index.adoc[Chapter 2: 인덱스] 11 | ** link:./contents/02-2_index_overview.adoc[인덱스 개요] 12 | ** link:./contents/02-3_clustered_index.adoc[클러스터드 인덱스] 13 | ** link:./contents/02-4_nonclustered_index.adoc[넌 클러스터드 인덱스] 14 | ** link:./contents/02-5_sparse_index.adoc[밀집 인덱스와 희소 인덱스] 15 | ** link:./contents/02-6_primary_index.adoc[기본 인덱스와 보조 인덱스] 16 | ** link:./contents/02-7_compounded_index.adoc[복합 키 인덱스] 17 | * link:./contents/02-lab4a.adoc[Lab 4a: 인덱스 생성 - MySQL] 18 | * link:./contents/02-lab4b.adoc[Lab 4b: 인덱스 생성 - Microsoft SQL Server] 19 | * link:./contents/02-lab4c.adoc[Lab 4c: 인덱스 생성 - Oracle] 20 | * link:./contents/02-lab4d.adoc[Lab 4d: 인덱스 생성 - Postgres] 21 | * link:./contents/99_review.adoc[검토] -------------------------------------------------------------------------------- /course/Module05_algebra_calcurus/contents/00_algebra_calcurus.adoc: -------------------------------------------------------------------------------- 1 | = Module 05: 관계 대수와 관계 해석 2 | 3 | 질의어는 데이터베이스에 저장된 데이터에 대한 질의를 위한 특수 언어입니다. 관계 데이터베이스 질의어는 절차를 표현하는 관계 대수와 결과를 명세하는 관계 해석의 형식 질의어를 기반으로 합니다. 이 모듈에서는 관계 대수와 관계 해석에 대해 알아봅니다. 4 | 5 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 6 | 7 | * 질의를 해석하여 릴레이션에서 결과를 도출하는 방법을 알게 됩니다. 8 | * 질의를 구성하는 여러 요소에 대해 설명할 수 있습니다. 9 | * 절차적 방법으로 질의를 해석하는 방법에 대해 설명할 수 있습니다. 10 | * 명세형 방법으로 질의를 해석하는 방법에 대해 설명할 수 있습니다. 11 | * 상용 SQL 언어들에서 절차적 방법과 명세형 방법을 사용하여 질의를 만드는 방법을 설명할 수 있습니다. 12 | 13 | == Table of COntents 14 | 15 | 1. link:./01-1_chapter1_algebra.adoc[관계 대수] 16 | 2. link:./02-1_chapter2_calcurus.adoc[관계 해석] 17 | 18 | --- 19 | 20 | link:./01-1_chapter1_algebra.adoc[다음: Chapter 1: 관계대수] -------------------------------------------------------------------------------- /course/Module05_algebra_calcurus/contents/01-1_chapter1_algebra.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: 관계 대수 2 | 3 | 관계 대수는 관계 모델에 관한 두 가지 형식 질의어 중의 하나로, 연산자들의 모임을 사용해서 대수로 표현됩니다. 대수로 표현되는 성질로 인해 연산자들을 조합하여 복잡한 질의를 만들기 쉽습니다. 이 장에서는 관계 대수에 대해 공부합니다. 4 | 5 | == Table of Contents 6 | 1. link:./01-2_algebra_overview.adoc[관계 대수 개요] 7 | 2. link:./01-3_selection_projection.adoc[셀렉션과 프로젝션] 8 | 3. link:./01-4_set_operation.adoc[집합 연산] 9 | 4. link:./01-5_row.adoc[이름 바꾸기] 10 | 5. link:./01-6_join.adoc[조인] 11 | 12 | --- 13 | 14 | link:./00_algebra_calcurus.adoc[이전: Module 05: 관계 대수와 관계 해석] + 15 | link:./01-2_algebra_overview.adoc[다음: 관계대수 개요] -------------------------------------------------------------------------------- /course/Module05_algebra_calcurus/contents/01-5_row.adoc: -------------------------------------------------------------------------------- 1 | = 이름 바꾸기 2 | 3 | * 릴레이션에서 필드의 이름을 변경(Renaming)할 수 있는 연산자 로우( ρ ) 4 | * 관계 대수식 안에서 이름 충돌이 발생할 수 있음 5 | * 관계 대수식 안에서 릴레이션 인스턴스의 이름을 주는 것이 편리함 6 | * 긴 대수식을 작은 부분으로 나누어 결과 인스턴스에 이름을 줄 수 있도록 하는 것이 편리함 7 | 8 | --- 9 | 10 | 관계 대수식에서 이름 충돌이 발생할 수 있는데 이런 경우 관계 대수식 안에서 인스턴스의 필드 이름을 줄 수 있는 것이 편리합니다. 또 긴 대수식을 작은 부분으로 나누어 결과 인스턴스에 이름을 줄 수 있도록 하는 것이 편리합니다. 11 | 12 | 이런 목적으로 개명(Renaming) 연산자 로우(ρ)를 사용할 수 있습니다. 13 | 14 | 아래와 같은 릴레이션 스키마가 있고, 15 | 16 | _파일럿(파일럿번호: 정수, 파일럿이름: 문자열, 등급: 정수, 나이: 실수)_ 17 | 18 | 릴레이션 스키마의 각 인스턴스 Pilot1이 아래와 같다고 할 때, 19 | 20 | [%header, cols=4, width=60%] 21 | |=== 22 | |파일럿번호 |파일럿이름 |등급 |나이 23 | |13 |홍길동 |1 |44 24 | |32 |이순신 |10 |44 25 | |44 |안중근 |7 |32 26 | |=== 27 | 28 | _ρ(Pilot3((~σ등급>5~(Pilot1))))_ 29 | 30 | 위 관계 대수식은 아래와 같은 릴레이션을 산출합니다. 결과 릴레이션의 이름은 Pilot3 입니다. 31 | 32 | [%header, cols=4, width=60%] 33 | |=== 34 | |파일럿번호 |파일럿이름 |등급 |나이 35 | |32 |이순신 |10 |47 36 | |44 |안중근 |7 |32 37 | |=== 38 | 39 | 아래의 관계 대수식은 40 | 41 | _π~파일럿이름,ρ(Grade(등급))~(σ~등급>5~(Pilot1))_ 42 | 43 | 아래와 같은 릴레이션을 산출합니다. 44 | 45 | [%header, cols=2, width=60%] 46 | |=== 47 | |파일럿이름 |Grade 48 | |이순신 |10 49 | |안중근 |7 50 | |=== 51 | 52 | --- 53 | 54 | link:./01-4_set_operation.adoc[이전: 집합 연산] + 55 | link:./01-6_join.adoc[다음: 조인] -------------------------------------------------------------------------------- /course/Module05_algebra_calcurus/contents/01-7_quiz.adoc: -------------------------------------------------------------------------------- 1 | = Quiz: 관계 대수 질의 2 | 3 | 아래와 같은 릴레이션 스키마가 있고, 4 | 5 | _파일럿(파일럿번호: 정수, 파일럿이름: 문자열, 등급: 정수, 나이: 실수) + 6 | 비행기(비행기번호: 정수, 비행기이름: 문자열, 비행기종류: 문자열) + 7 | 운항(파일럿번호: 정수, 비행기번호: 정수, 운항일자: 날짜)_ 8 | 9 | 각 릴레이션의 인스턴스가 아래와 같다고 할 때, 10 | 11 | Pilot1 12 | 13 | [%header, cols=4, width=60%] 14 | |=== 15 | |파일럿번호 |파일럿이름 |등급 |나이 16 | |13 |홍길동 |1 |44 17 | |32 |이순신 |10 |44 18 | |44 |안중근 |7 |32 19 | |=== 20 | 21 | AirCraft 22 | [%header, cols=3, width=60%] 23 | |=== 24 | |비행기번호 |비행기이름 |비행기종류 25 | |101 |에놀라게이 |폭격기 26 | |102 |톰캣 |전투기 27 | |103 |블랙버드 |정찰기 28 | |=== 29 | 30 | Flight 31 | 32 | [%header, cols=3, width=60%] 33 | |=== 34 | |파일럿번호 |비행기번호 |운항일자 35 | |13 |101 |2022-10-09 36 | |44 |102 |2022-11-23 37 | |=== 38 | 39 | 관계 대수로 질의를 작성합니다. 40 | 41 | 1. 비행기 101을 운항하는 파일럿의 이름을 구하세요. 42 | 2. 문제 1을 응용하여 개명 연산을 사용하여 각 대수식을 작은 부분으로 분할한 다음 합쳐 연산하는 관계 대수식을 작성하세요. 43 | 3. 전투기를 운항하는 파일럿의 이름을 구하세요. 44 | 4. 이순신이 조종하는 비행기의 종류를 구하세요. 45 | 5. 운항 스케줄이 잡혀있는 모든 파일럿의 이름을 구하세요. 46 | 6. 폭격기 또는 정찰기를 운항하는 파일럿의 이름을 구하세요. 47 | 7. 전투기와 폭격기를 운형하는 파일럿의 이름을 구하세요. 48 | 8. 폭격기를 운항하지 않는 나이가 40세 이상의 파일럿의 파일럿번호를 구하세요. 49 | 50 | --- 51 | 52 | link:./01-6_join.adoc[이전: 조인] + 53 | link:./02-1_chapter2_calcurus.adoc[다음: Chapter 2: 관계 해석] -------------------------------------------------------------------------------- /course/Module05_algebra_calcurus/contents/02-1_chapter2_calcurus.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: 관계 해석 2 | 3 | 관계 해석은 관계 대수의 대안입니다. 관계 대수가 절차형인데 반하여 관계 해석은 비절차형, 즉 명세형으로서 계산 방법을 명세함이 없이 답의 집합을 표현할 수 있습니다. 관계 해석은 SQL과 같은 상업적인 질의어 설계에 많은 영향을 주었습니다. 이번 장에서는 관계 해석에 대해 공부합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./02-2_tuple.adoc[투플 관계 해석] 8 | 2. link:./02-4_domain.adoc[도메인 관계 해석] 9 | 10 | --- 11 | 12 | link:./01-7_quiz.adoc[이전: Quiz: 관계 대수 질의] + 13 | link:./02-2_tuple.adoc[다음: 투플 관계 해석] -------------------------------------------------------------------------------- /course/Module05_algebra_calcurus/contents/02-3_quiz.adoc: -------------------------------------------------------------------------------- 1 | = Quiz: 투플 관계 해석 질의 2 | 아래와 같은 릴레이션 스키마가 있고, 3 | 4 | _파일럿(파일럿번호: 정수, 파일럿이름: 문자열, 등급: 정수, 나이: 실수) 5 | 비행기(비행기번호: 정수, 비행기이름: 문자열, 비행기종류: 문자열) 6 | 운항(파일럿번호: 정수, 비행기번호: 정수, 운항일자: 날짜)_ 7 | 8 | 각 릴레이션의 인스턴스가 아래와 같다고 할 때, 9 | 10 | Pilot1 11 | 12 | [%header, cols="1,1,1,1", width=60%] 13 | |=== 14 | |파일럿번호 |파일럿이름 |등급 |나이 15 | |13 |홍길동 |1 |44 16 | |32 |이순신 |10 |44 17 | |44 |안중근 |7 |32 18 | |=== 19 | 20 | AirCraft 21 | 22 | [%header, cols="1,1,1", width=60%] 23 | |=== 24 | |비행기번호 |비행기이름 |비행기종류 25 | |101 |에놀라게이 |폭격기 26 | |102 |톰캣 |전투기 27 | |102 |블랙버드 |정찰기 28 | |=== 29 | 30 | Flight 31 | 32 | [%header, cols="1,1,1", width=60%] 33 | |=== 34 | |파일럿번호 |비행기번호 |운항일자 35 | |13 |101 |2022-10-09 36 | |44 |102 |2022-11-23 37 | |=== 38 | 39 | 투플 관계 해석으로 아래 질의를 작성하세요. 40 | 41 | 1. 각 비행 건에 대해 파일럿이름, 비행기번호, 운항일자를 구하세요. 42 | 2. 비행기 102를 운항하면서 등급이 5이상인 모든 파일럿을 구하세요. 43 | 3. 폭격기를 운항하고 등급이 5 이상인 모든 파일럿을 구하세요. 44 | 4. 전투기를 운항하는 모든 파일럿을 구하세요. 45 | 46 | --- 47 | 48 | link:./02-2_tuple.adoc[이전: 투플 관계 해석] + 49 | link:./02-4_domain.adoc[다음: 도메인 관계 해석] -------------------------------------------------------------------------------- /course/Module05_algebra_calcurus/contents/02-5_quiz.adoc: -------------------------------------------------------------------------------- 1 | = Quiz: 도메인 관계 해석 질의 2 | 3 | 아래와 같은 릴레이션 스키마가 있고, 4 | 5 | _파일럿(파일럿번호: 정수, 파일럿이름: 문자열, 등급: 정수, 나이: 실수) 6 | 비행기(비행기번호: 정수, 비행기이름: 문자열, 비행기종류: 문자열) 7 | 운항(파일럿번호: 정수, 비행기번호: 정수, 운항일자: 날짜)_ 8 | 9 | 각 릴레이션의 인스턴스가 아래와 같다고 할 때, 10 | 11 | Pilot1 12 | 13 | [%header, cols="1,1,1,1", width=60%] 14 | |=== 15 | |파일럿번호 |파일럿이름 |등급 |나이 16 | |13 |홍길동 |1 |44 17 | |32 |이순신 |10 |44 18 | |44 |안중근 |7 |32 19 | |=== 20 | 21 | AirCraft 22 | 23 | [%header, cols="1,1,1", width=60%] 24 | |=== 25 | |비행기번호 |비행기이름 |비행기종류 26 | |101 |에놀라게이 |폭격기 27 | |102 |톰캣 |전투기 28 | |102 |블랙버드 |정찰기 29 | |=== 30 | 31 | Flight 32 | 33 | [%header, cols="1,1,1", width=60%] 34 | |=== 35 | |파일럿번호 |비행기번호 |운항일자 36 | |13 |101 |2022-10-09 37 | |44 |102 |2022-11-23 38 | |=== 39 | 40 | 도메인 관계 해석으로 아래 질의를 작성하세요. 41 | 42 | 1. 비행기 102를 운항하고 등급이 5이상인 파일럿을 구하세요. 43 | 2. 전투기를 조종하며 등급이 5 이상인 모든 파일럿의 이름을 구하세요. 44 | 3. 비행기를 조종하는 모든 파일럿을 구하세요. 45 | 4. 폭격기를 조종하는 모든 파일럿을 구하세요. 46 | 47 | --- 48 | 49 | link:./02-4_domain.adoc[이전: 도메인 관계 해석] -------------------------------------------------------------------------------- /course/Module05_algebra_calcurus/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module05_algebra_calcurus/images/image01.png -------------------------------------------------------------------------------- /course/Module05_algebra_calcurus/readme.adoc: -------------------------------------------------------------------------------- 1 | link:./contents/00_algebra_calcurus.adoc[Module 05: 관계대수와 관계해석] 2 | 3 | * link:./contents/01-1_chapter1_algebra.adoc[Chapter 1: 관계 대수] 4 | ** link:./contents/01-2_algebra_overview.adoc[관계 대수 개요] 5 | ** link:./contents/01-3_selection_projection[셀렉션과 프로젝션] 6 | ** link:./contents/01-4_set_operation[집합 연산] 7 | ** link:./contents/01-5_row[이름 바꾸기] 8 | ** link:./contents/01-6_join[조인] 9 | ** link:./contents/01-7_quiz[Quiz] 10 | * link:./contents/02-1_chapter2_calcurus.adoc[Chapter 2: 관계 해석] 11 | ** link:./contents/02-2_tuple.adoc[투플 관계 해석] 12 | ** link:./contents/02-3_quiz.adoc[Quiz] 13 | ** link:./contents/02-4_domain.adoc[도메인 관계 해석] 14 | ** link:./contents/02-5_quiz.adoc[Quiz] 15 | -------------------------------------------------------------------------------- /course/Module06_sql/contents/00_introduction.adoc: -------------------------------------------------------------------------------- 1 | = Module 06: SQL 2 | 3 | SQL 가장 널리 사용되는 상용 관계 데이터베이스 언어입니다. IBM에서 처음 개발되어 적용된 이후 많은 DBMS 벤더들이 자사의 제품에 구현하였으며, 현재는 데이터베이스 질의의 표준으로 사용되고 있습니다. 이 모듈에서는 SQL에 대해 공부합니다. 4 | 5 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 6 | 7 | • SQL 언어의 역할을 이해하고 구분할 수 있습니다. 8 | • 관계 대수와 관계 해석을 기반으로 한 SQL을 작성할 수 있습니다. 9 | • SQL 질의 형식을 이해하고 요구에 맞는 질의를 작성할 수 있습니다. 10 | • 집합 관계를 SQL 언어로 표현할 수 있습니다. 11 | • 포함된 쿼리, 널 값 처리 등 복잡한 문제와 다양한 질의를 처리할 수 있습니다. 12 | 13 | == Table of Contents 14 | 15 | 1. link:./01-1_chapter1_introduction_to_sql.adoc[SQL 개요] 16 | 2. link:./02-1_chapter2_ddl.adoc[DDL: Data Definition Language] 17 | 3. link:./03-1_chapter3_dml.adoc[DML: Data Manipulation Language] 18 | 4. link:./04-1_chapter4_set_operation.adoc[집합 연산] 19 | 5. link:./05-1_chapter5_subquery.adoc[서브 쿼리] 20 | 6. link:./06-1_chapter6_aggregate_calculation.adoc[집단 연산] 21 | 7. link:./07-1_chapter7_order.adoc[정렬] 22 | 8. link:./08-1_chapter8_insert.adoc[삽입] 23 | 9. link:./09-1_chapter9_update.adoc[갱신] 24 | 10. link:./10-1_chapter10_delete.adoc[삭제] 25 | 26 | --- 27 | 28 | link:./02_introduction_to_sql.adoc[다음: SQL 개요] -------------------------------------------------------------------------------- /course/Module06_sql/contents/01-1_chapter1_introduction_to_sql.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: SQL 개요 2 | 3 | SQL(Structured Query Language)는 현재 가장 널리 사용되는 상용 관계 데이터베이스 언어로, IBM에서 수행한 SEQUEL-XRM 및 System-R 프로젝트의 수행 결과입니다. 이 장에서는 SQL의 개요에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./01-2_introduction_to_sql.adoc[SQL 개요] 8 | 2. link:./01-3_sql_org.adoc[SQL 구성] 9 | 10 | --- 11 | 12 | link:./00_introduction.adoc[이전: Module 06: SQL] + 13 | link:./01-2_introduction_to_sql.adoc[다음: SQL 개요] -------------------------------------------------------------------------------- /course/Module06_sql/contents/02-1_chapter2_ddl.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: DDL: Data Definition Language 2 | 3 | DDL은 사용자 또는 응용 프로그램이 컴퓨터의 데이터를 정의하는 컴퓨터 언어 또는 프로그램 언어 요소로, SQL에서는 관계 데이터베이스의 구조를 정의하는 SQL 언어의 부분집합입니다. 이 장에서는 관계 데이터베이스의 구조를 정의하는 SQL언어를 공부합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./02-2_ddl.adoc[DDL: Data Definition Language] 8 | 2. link:./02-3_ddl_in_sql.adoc[DDL 구문] 9 | 3. link:./02-4_create_alter_drop.adoc[테이블 생성, 수정, 삭제 DDL 문] 10 | 11 | --- 12 | 13 | link:./01-3_sql_org.adoc[이전: SQL 구성] + 14 | link:./02-2_ddl.adoc[다음: DDL - Data Definition Language란?] -------------------------------------------------------------------------------- /course/Module06_sql/contents/02-2_ddl.adoc: -------------------------------------------------------------------------------- 1 | = DDL: Data Definition Language 2 | 3 | • 데이터 정의 언어 4 | ** 데이터를 정의하는 컴퓨터 언어 또는 컴퓨터 언어 요소 5 | ** SQL에서는 관계 데이터베이스의 구조를 정의하는 SQL 언어의 부분집합 6 | • SQL에서의 DDL 7 | ** 관계 데이터베이스의 구조를 정의 8 | ** 행, 속성, 관계, 인덱스, 뷰, 저장 프로시저 등 데이터베이스의 구조와 객체 정의 9 | 10 | --- 11 | 12 | 데이터 정의 언어(Data Definition Language)는 사용자 또는 응용 프로그램이 컴퓨터의 데이터를 정의하는 컴퓨터 언어 또는 컴퓨터 언어 요소를 말합니다. XML에서 사용되는 DTD는 순수한 데이터 정의 언어의 예라고 할 수 있습니다. 13 | 14 | SQL에서 데이터 정의언어는 관계 데이터베이스의 구조와 객체를 정의하는 SQL 언어의 부분집합입니다. SQL에서는 테이블의 열과 행, 테이블의 무결성을 위한 제약 조건과 인덱스 등의 관계 데이터베이스 고유의 특성을 포함하는데, SQL에서는 이런 데이터베이스의 구조와 객체를 정의하기 위해 DDL로 분류되는 SQL 언어의 부분집합을 사용합니다. 15 | 16 | SQL 데이터 정의 언어의 문은 관계 데이터베이스 관리 시스템의 일부이며 상용 DBMS 마다 구분이 다릅니다. 17 | 18 | --- 19 | 20 | link:./02-1_chapter2_ddl.adoc[이전: Chapter 2: DDL - Data Definition Language] + 21 | link:./02-3_ddl_in_sql.adoc[다음: SQL에서 DDL 구문] -------------------------------------------------------------------------------- /course/Module06_sql/contents/02-lab6-1c.adoc: -------------------------------------------------------------------------------- 1 | = Lab 6-1c: 테이블 생성 (Oracle) 2 | 3 | 이 연습에서는 Oracle에서 아래 릴레이션 스키마를 가지는 릴레이션 인스턴스(테이블)을 생성합니다. 4 | 5 | _Passenger(PassengerNo: Integer, PassengerName: String, Grade: Integer, Age: Integer) + 6 | Aircraft(AircraftNo: Integer, KindOfAircraft: String, Airline: String) + 7 | Flight(FlightNo: Integer, AircraftNo: Integer, Departure: Int, Arrival:String, FlightDate: Date, AircraftNo: Integer) + 8 | Reservation(PassengerNo: Integer, FlightNo: Integer, ReservedDate: Date, FlightNo: Integer, PassengerNo: Integer)_ 9 | 10 | --- 11 | 12 | link:./09-2_lab6-1b.adoc[이전: Lab 6-1b: 테이블 생성 (Microsoft SQL Server)] + 13 | link:./09-4_lab6-1d.adoc[다음: Lab 6-1d: 테이블 생성 (Postgres)] -------------------------------------------------------------------------------- /course/Module06_sql/contents/02-lab6-1d.adoc: -------------------------------------------------------------------------------- 1 | = Lab 6-1d: 테이블 생성 (Postgres) 2 | 3 | 이 연습에서는 Postgres에서 아래 릴레이션 스키마를 가지는 릴레이션 인스턴스(테이블)을 생성합니다. 4 | 5 | _Passenger(PassengerNo: Integer, PassengerName: String, Grade: Integer, Age: Integer) + 6 | Aircraft(AircraftNo: Integer, KindOfAircraft: String, Airline: String) + 7 | Flight(FlightNo: Integer, AircraftNo: Integer, Departure: Int, Arrival:String, FlightDate: Date, AircraftNo: Integer) + 8 | Reservation(PassengerNo: Integer, FlightNo: Integer, ReservedDate: Date, FlightNo: Integer, PassengerNo: Integer)_ 9 | 10 | --- 11 | 12 | link:./02-lab6-1c.adoc[이전: 테이블 생성 (Oracle)] + 13 | link:./03-1_chapter3_dml.adoc[DML: Data Manipulation Language, SQL 질의 기본 구조] -------------------------------------------------------------------------------- /course/Module06_sql/contents/03-1_chapter3_dml.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 3: DML: Data Manipulation Language, SQL 질의 기본 구조 2 | 3 | SQL 질의는 SELECT, FROM, WHERE 절로 이루어진 기본 구조를 가지고 동작합니다. 이 장에서는 SQL 질의를 이루는 기본 구조에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03-3_sql_query_type.adoc[SQL 질의 형식] 8 | 2. link:./03-4_select_clause.adoc[SELECT 절] 9 | 3. link:./03-5_expression_n_string_in_sql.adoc[SELECT 명령 내의 수식과 문자열] 10 | 4. link:./03-6_from_clause.adoc[FROM 절] 11 | 5. link:./03-7_where_clause.adoc[WHERE 절] 12 | 13 | --- 14 | 15 | link:./02-lab6-1d.adoc[이전: Lab 6-1d: 테이블 생성 (Postgres)] + 16 | link:./03-2_note.adoc[다음: 참고, 예제 릴리이션 스키마와 인스턴스] -------------------------------------------------------------------------------- /course/Module06_sql/contents/04-1_chapter4_set_operation.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 4: 집합 연산 2 | 3 | SQL은 집합 조작 연산 세가지를 제공하여 기본 질의를 확장합니다. SQL 질의의 결과는 릴레이션, 투플의 집합이기 때문에 합집합, 교집합, 차집합 등의 집합 연산을 사용하는 것은 자연스러운 일입니다. SQL에서는 UNION, INTERSECT, EXCEPT 세 가지 집합 연산을 지원합니다. 이 장에서는 SQL의 집합 연산에 대해 공부합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./04-2_union.adoc[UNION] 8 | 2. link:./04-3_intersect.adoc[INTERSECT] 9 | 3. link:./04-4_except.adoc[EXCEPT] 10 | 11 | --- 12 | 13 | link:./03-7_where_clause[이전: WHERE 절] + 14 | link:./04-2_union.adoc[다음: 집합 연산] -------------------------------------------------------------------------------- /course/Module06_sql/contents/04-4_except.adoc: -------------------------------------------------------------------------------- 1 | = EXCEPT 2 | 3 | * 관계 대수식의 차집합에 대응 4 | * 두 SQL 질의의 결과가 합병 가능 조건이면 EXCEPT 연산 가능 5 | * SELECT 절과는 다르게 기본적으로 중복을 제거함 6 | * EXCEPT ALL을 사용하여 모든 중복을 유지할 수 있음 7 | 8 | --- 9 | 10 | `EXCEPT` 는 관계 대수식의 합집합에 대응하며, 두 질의의 결과가 합병 가능 조건이면 `EXCEPT` 연산이 가능합니다. `SELECT`` 절과는 다르게 기본적으로 중복을 제거하며, 중복을 유지하고자 한다면 `EXCEPT ALL` 을 사용하여야 합니다. 11 | 12 | > 대한항공을 이용한 승객 중 다른 항공을 한번도 이용하지 않은 승객의 이름과 등급을 구하라 13 | 14 | 위 질의는 아래와 같은 관계 대수식으로 작성할 수 있습니다. 15 | 16 | _ρ(aFlight, (σAirline=대한항공Aircraft⋈Flight⋈Reservation) - (σAirline≠대한항공Aircraft⋈Flight⋈Reservation)) + 17 | πPassengerName, Age(tempFlight ⋈ Passenger)_ 18 | 19 | 위 관계 대수식은 SQL 질의로 아래와 같이 작성할 수 있습니다. 20 | 21 | [source, sql] 22 | ---- 23 | SELECT Passenger.PassengerName, Grade FROM 24 | (SELECT Reservation.PassengerNo FROM 25 | Aircraft INNER JOIN Flight ON Aircraft.AircraftNo = Flight.AircraftNo 26 | INNER JOIN Reservation ON Flight.FlightNo = Reservation.FlightNo 27 | WHERE Airline = '대한항공' 28 | EXCEPT 29 | SELECT Reservation.PassengerNo FROM 30 | Aircraft INNER JOIN Flight ON Aircraft.AircraftNo = Flight.AircraftNo 31 | INNER JOIN Reservation ON Flight.FlightNo = Reservation.FlightNo 32 | WHERE Airline <> '대한항공') AS tempFlight 33 | INNER JOIN Passenger ON tempFlight.PassengerNo = Passenger.PassengerNo 34 | ---- 35 | 36 | **_주의_** + 37 | MySQL 8.13 이하의 버전에서는 릴레이션 집합간의 차집합을 산출하는 EXCEPT 연산을 지원하지 않습니다. 38 | 39 | --- 40 | 41 | link:./04-3_intersect.adoc[이전: INTERSECT] + 42 | link:./05-1_chapter5_subquery.adoc[다음: Chapter 5: 서브쿼리] -------------------------------------------------------------------------------- /course/Module06_sql/contents/05-1_chapter5_subquery.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 5: 서브 쿼리 2 | 3 | SQL의 강력한 기능중의 하나는 포함된 질의입니다. 쿼리에 포함된 쿼리를 서브 쿼리(Subquery)라고 합니다. 질의를 작성하다 보면 어떤 릴레이션을 계산해내고 그 릴레이션에 질의를 할 경우가 필요할 때가 있습니다. 이런 중간 단계 테이블을 만들어내는 질의가 서브 쿼리이고 이를 포함하여 전체 쿼리를 구성할 수 있습니다. 서브 쿼리는 WHERE절, FROM절, HAVING 절 등에 쓸 수 있습니다. 이 장에서는 서브 쿼리에 대해 공부합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./05-2_introduction_2_subquery.adoc[서브 쿼리 개요] 8 | 2. link:./05-3_nested_subquery.adoc[포함된 서브쿼리(Nested subquery)] 9 | 3. link:./05-4_inlineview.adoc[인라인 뷰(Inline view)] 10 | 4. link:./05-5_scalar_subquery.adoc[스칼라 서브쿼리(Scalar subquery)] 11 | 5. link:./05-6_correlated_subquery.adoc[상호 연관 서브쿼리(Correlated Subquery)] 12 | 13 | --- 14 | 15 | link:./04-4_except.adoc[이전: EXCEPT] + 16 | link:./05-2_introduction_2_subquery.adoc[다음: 서브쿼리 개요] 17 | -------------------------------------------------------------------------------- /course/Module06_sql/contents/06-1_chapter6_aggregate_calculation.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 6: 집단 연산 2 | 3 | 데이터베이스에서는 데이터를 검색하는 것이 주 목적이지만, 데이터에 대한 통계나 계산도 필요합니다. 또한, 집단에 대한 값을 비교하고 처리하는 방법도 필요합니다. 이 단원에서는 집단 연산과 집계 함수에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 1. link:./06-2_aggregate_function.adoc[집계 함수] 7 | 2. link:./06-3_groupby_n_having.adoc[GROUP BY절과 HAVING 절] 8 | 9 | --- 10 | 11 | link:./05-6_correlated_subquery.adoc[이전: 상관관계 서브쿼리] + 12 | link:./06-2_aggregate_function.adoc[다음: 집계함수] -------------------------------------------------------------------------------- /course/Module06_sql/contents/07-1_chapter7_order.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 7: 정렬 2 | 3 | 데이터베이스의 테이블에서 질의를 수행하면 테이블은 데이터가 삽입된 순서대로 데이터를 산출할 뿐, 결과를 정렬하지 않습니다. 때때로 질의의 결과는 컬럼을 기준으로 정렬될 필요가 있고, 관계 데이터베이스는 결과를 정렬할 수 있는 몇 가지 방법을 제공합니다. 이 단원에서는 결과를 정렬하는 방법에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./07-2_orderby.adoc[ORDER BY를 이용한 정렬] 8 | 2. link:./07-3_order_by_index.adoc[INDEX를 이용한 정렬] 9 | 10 | --- 11 | 12 | link:./06-3_groupby_n_having.adoc[이전: GROUP BY절과 HAVING 절] + 13 | link:./07-2_orderby.adoc[다음: ORDER BY] -------------------------------------------------------------------------------- /course/Module06_sql/contents/08-1_chapter8_insert.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 8: 삽입 2 | 3 | 데이터베이스에서 질의의 응답으로 데이터를 산출하기 위해서는 SELECT 문을 사용합니다. 반대로 데이터를 삽입하기 위해서는 INSERT 문을 사용합니다. 이번 단원에서는 INSERT 문을 사용하여 데이터를 삽입하는 방법을 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./08-2_insert_clause.adoc[INSERT 문] 8 | 2. link:./08-3_insert2.adoc[하나의 INSERT 문으로 여러 행 삽입] 9 | 3. link:./08-4_sql92_standard.adoc[SQL92 표준] 10 | 11 | --- 12 | 13 | link:./07-3_order_by_index.adoc[이전: 인덱스를 이용한 정렬] + 14 | link:./08-2_insert_clause.adoc[다음: INSERT 문] -------------------------------------------------------------------------------- /course/Module06_sql/contents/08-2_insert_clause.adoc: -------------------------------------------------------------------------------- 1 | = INSERT 문 2 | 3 | * 테이블에 투플을 삽입하기 위해 사용 4 | 5 | [source, sql] 6 | ---- 7 | INSERT INTO 8 | [(Column Name 1, Column Name2, … Column Name n)] 9 | VALUES (Value 1, Value 2 … Value 3) 10 | ---- 11 | 12 | --- 13 | 14 | SELECT 절은 데이터 검색을 위한 것으로, 질의를 수행하면 데이터베이스가 데이터를 산출하여 요청한 쪽으로 반환하는 형식으로 이루어집니다. 데이터의 삽입은 이와 반대로 쿼리를 실행하는 쪽에서 데이터베이스로 데이터를 전송하여 데이터를 삽입하는 형식으로 이루어집니다. 15 | 16 | 데이터베이스에 데이터를 삽입하기 위해서는 INSERT 문을 사용하며, 삽입은 투플 단위로 이루어집니다. `INSERT` 문의 기본 구문은 아래와 같습니다. 17 | 18 | [source, sql] 19 | ---- 20 | INSERT INTO
21 | [(Column Name 1, Column Name2, … Column Name n)] 22 | VALUES (Value 1, Value 2 … Value 3) 23 | ---- 24 | 25 | Passenger 테이블에 새 고객 데이터를 삽입하려면 아래와 같은 질의를 수행하여 삽입할 수 있습니다. 26 | 27 | [source, sql] 28 | ---- 29 | INSERT INTO Passenger 30 | (PassengerNo, PassengerName, Grade, Age) 31 | VALUES (8, ‘조지훈’, 9, 43); 32 | ---- 33 | 34 | 고객의 나이가 파악되지 않아 Age 컬럼에 NULL을 삽입하고자 한다면, 아래와 같이 테이블명 뒤의 컬럼 목록에서 제외하여 삽입할 수 있습니다. 컬럼에 Default 값이 지정된 경우에도 삽입될 컬럼을 명시하지 않고 기본값이 입력되도록 지정할 수 있습니다. 35 | 36 | [source, sql] 37 | ---- 38 | INSERT INTO Passenger 39 | (PassengerNo, PassengerName, Grade) 40 | VALUES (9, ‘이외수’, 9); 41 | ---- 42 | 43 | 테이블의 모든 컬럼에 데이터를 컬럼 순서대로 삽입하려고 한다면, 테이블명 뒤의 컬럼 목록 없이 삽입할 수 있습니다. 44 | 45 | [source, sql] 46 | ---- 47 | INSERT INTO Passenger 48 | VALUES (10, '박목월', 63); 49 | ---- 50 | 51 | --- 52 | 53 | link:./08-1_chapter8_insert.adoc[이전: Chapter 8: 삽입] + 54 | link:./08-3_insert2.adoc[다음: 하나의 INSERT 문으로 여러 행 삽입] -------------------------------------------------------------------------------- /course/Module06_sql/contents/08-4_sql92_standard.adoc: -------------------------------------------------------------------------------- 1 | = SQL 1999 표준 2 | 3 | * SQL1999에서 Insert문의 표준을 정의 4 | * 구현은 각 DBMS마다 조금씩 다름 5 | 6 | [source, sql] 7 | ---- 8 | ::= 9 | INSERT INTO 10 | 11 | ::= 12 |
13 | ::= 14 | 15 | ---- 16 | 17 | --- 18 | 19 | SQL 1999 표준은 DBMS의 INSERT 문 구현에 대한 권고를 제안하고 있습니다. SQL 1999의 INSERT 문 표준은 다음과 같습니다. 20 | 21 | [source, sql] 22 | ---- 23 | ::= 24 | INSERT INTO 25 | 26 | ::= 27 |
28 | ::= 29 | 30 | | 31 | | 32 | ::= 33 | [ ] 34 | [ override clause> ] 35 | 36 | ::= 37 | [ ] 38 | [ ] 39 | 40 | ::= 41 | OVERRIDING USER VALUE 42 | | OVERRIDING SYSTEM VALUE 43 | ::= 44 | DEFAULT VALUES 45 | ::= 46 | ---- 47 | 48 | --- 49 | 50 | link:./08-3_insert2.adoc[이전: 하나의 INSERT 문으로 여러 행 삽입] + 51 | link:./09-1_update.adoc[다음: Chapter 9: 갱신] -------------------------------------------------------------------------------- /course/Module06_sql/contents/09-1_chapter9_update.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 9: 갱신 2 | 3 | 데이터베이스에서 데이터의 갱신은 매우 빈번하게 일어납니다. DBMS는 데이터의 갱신을 위해 UPDATE 문을 사용합니다. 이 단원에서는 UPDATE 구문을 사용한 데이터 갱신에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./09-2_update_clause.adoc[UPDATE문] 8 | 2. link:./09-3_sql92_standard.adoc[SQL1999 표준] 9 | 10 | --- 11 | 12 | link:./08-4_sql92_standard.adoc[이전:SQL 1999 표준] + 13 | link:./09-2_update_clause.adoc[다음: UPDATE 문] -------------------------------------------------------------------------------- /course/Module06_sql/contents/10-1_chapter10_delete.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 10: 삭제 2 | 3 | 데이터베이스에 데이터를 삽입하고 산출할 수 있다면 삭제도 가능해야 합니다. DBMS는 데이터의 삭제을 위해 UPDATE 문을 사용합니다. 이 단원에서는 DELETE 문을 사용한 데이터 삭제에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./10-2_delete_clause.adoc[DELETE문] 8 | 2. link:./10-3_sql92.adoc[SQL1999 표준] 9 | 10 | --- 11 | 12 | link:./09-3_sql92_standard.adoc[이전: UPDATE SQL 92 표준] + 13 | link:./10-2_delete_clause.adoc[다음: DELETE 문] -------------------------------------------------------------------------------- /course/Module06_sql/contents/10-3_sql92.adoc: -------------------------------------------------------------------------------- 1 | = SQL 1999 표준 2 | 3 | * SQL1999에서 DELETE문의 표준을 정의 4 | * 구현은 각 DBMS마다 조금씩 다름 5 | 6 | [source, sql] 7 | ---- 8 | ::= 9 | DELETE FROM 10 | [ WHERE ] 11 | ---- 12 | 13 | --- 14 | 15 | SQL 1999 표준은 DBMS의 DELETE문 구현에 대한 권고를 제안하고 있습니다. SQL 1999의 UPDATE 문 표준은 다음과 같습니다. 16 | 17 | [source, sql] 18 | ---- 19 | ::= 20 | DELETE FROM 21 | [ WHERE ] 22 | ---- 23 | 24 | SQL 1999 표준은 Cursor를 사용하는 포지션에 대한 DELETE 구문에 대한 권고도 포함합니다. 25 | 26 | [source, sql] 27 | ---- 28 | ::= 29 | DELETE FROM 30 | WHERE CURRENT OF 31 | ::= [ ONLY ]
32 | ---- 33 | 34 | --- 35 | 36 | link:./10-2_delete_clause.adoc[이전: DELETE SQL 92 표준] + 37 | link:./99_review.adoc[다음: 검토] -------------------------------------------------------------------------------- /course/Module06_sql/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image01.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image02.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image03.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image04.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image05.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image06.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image07.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image08.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image09.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image10.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image11.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image12.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image13.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image14.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image15.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image16.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image17.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image18.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image19.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image20.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image21.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image22.png -------------------------------------------------------------------------------- /course/Module06_sql/images/image23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module06_sql/images/image23.png -------------------------------------------------------------------------------- /course/Module07_security_view/contents/00_security_view.adoc: -------------------------------------------------------------------------------- 1 | = Module 07: 보안과 뷰 2 | 3 | 데이터베이스 관리 시스템은 데이터의 안전과 무결성을 유지하기 위해 접근을 통제할 수 있는 보안 기법을 제공하며, 프로시저를 저장하여 재사용할 수 있도록 하고, 특정 동작을 트리거 할 수 있는 방법을 제공합니다. 이 모듈에서는 보안 관점에서의 뷰, 재사용 가능한 동작 관점에서의 저장 프로시저, 한 동작이 다른 동작을 유발하는 관점에서의 트리거, 군집 반복을 지원하지 않는 호스트 언어에서의 동작 관점에서의 커서에 대해 알아봅니다. 4 | 5 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 6 | * 관계 데이터베이스의 보안을 이해합니다. 7 | * 외부 스키마 관점에서의 뷰를 설명하고 지정할 수 있습니다. 8 | 9 | == Table of contents 10 | 11 | 1. link:./01-1_chapter1_security.adoc[데이터베이스 보안] 12 | 2. link:./02-1_chapter2_view.adoc[뷰] 13 | 14 | --- 15 | 16 | link:./01-1_chapter1_security.adoc[다음: Chapter 1: 데이터베이스 보안] -------------------------------------------------------------------------------- /course/Module07_security_view/contents/01-1_chapter1_security.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: 데이터베이스 보안 2 | 3 | 데이터베이스 관리 시스템은 한 기업체의 거의 모든 측면에 대한 데이터를 저장하는데 사용됩니다. DBMS에 저장되어 있는 데이터는 조직의 사업을 유지하는 생명과도 같은 것으로 취급되고, 회사의 자산으로 취급됩니다. DBMS는 데이터의 본질적인 가치를 유지하기 위해 데이터에 대해 접근을 통제할 수 있는 여러 방안들을 제공합니다. 이 단원에서는 보안과 사용자별 접근을 제어할 수 있는 뷰에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 1. link:./01-2_overview_security.adoc[데이터베이스 보안 개요] 7 | 2. link:./01-3_user_object.adoc[User 개체] 8 | 3. link:./01-4_access_control.adoc[접근 제어] 9 | 4. link:./01-5_dac.adoc[재량 접근 제어] 10 | 5. link:./01-6_privilege.adoc[특권] 11 | 6. link:./01-7_nece.adoc[필수 접근 제어] 12 | 13 | --- 14 | 15 | link:./00_security_view.adoc[이전: Module 07: 보안과 뷰] + 16 | link:./01-2_overview_security.adoc[다음: 데이터베이스 보안 개요] -------------------------------------------------------------------------------- /course/Module07_security_view/contents/01-2_overview_security.adoc: -------------------------------------------------------------------------------- 1 | = 데이터베이스 보안 개요 2 | 3 | * 안전한 데이터베이스 응용 설계 + 4 | * 보안(Security) + 5 | 정보가 권한 없는 사용자에게 누출되어서는 안된다 6 | * 무결성(Integrity) + 7 | 권한 있는 사용자에게만 데이터의 수정이 허용된다 8 | * 가용성(Availability) + 9 | 권한 있는 사용자의 접근이 제한되어서는 안된다 10 | * 명확하고 일관성 있는 보안 정책의 설정 필요 11 | * DBMS는 데이터 보안에 대한 메커니즘을 제공 12 | 13 | --- 14 | 15 | 데이터베이스 관리 시스템은 한 기업체의 모든 측면에 대한 정보를 저장합니다. 따라서 DBMS에 있는 데이터는 조직체의 사업적인 분야에 있어 가장 중요한 부분인 경우가 많으며, 회사의 자산으로 취급됩니다. 데이터를 본질적인 가치를 보호하는 일 이외에도 회사는 사적 정보에 대한 기밀을 보장하거나 기타 여러가지 이유로 어떤 사용자 그룹에게 누출되어서는 안되는 데이터에 대해 접근을 통제할 수 있는 여러 방안들을 강구해야 합니다. 16 | 안전한 데이터베이스 응용을 설계할 때 고려하는 목표는 다음과 같은 세 가지가 있습니다. 17 | 18 | * 1. 보안(Securty) + 19 | 정보가 권한 없는 사용자에게 누출되어서는 안된다. 예를 들어 학생이 다른 학생의 점수를 볼 수 없도록 해야 한다. 20 | * 2. 무결성(Integrity) + 21 | 권한이 있는 사용자에 대해서만 데이터 수정이 허용되어야 한다. 예를 들어 학생들이 자기 점수는 볼 일이 있으나 그 점수를 수정할 수는 없도록 해야 한다. 22 | * 3. 가용성(Availability) + 23 | 권한 있는 사용자의 접근이 거부되어서는 안된다. 예를 들어 교수가 어떤 학점을 바꾸고자 하면 그렇게 할 수 있도록 허용되어야 한다. 24 | 25 | 이런 목표들을 달성하기 위하여, 명확하고 일관성이 있는 보안 정책을 수립하여 어떤 보안 사항들을 집행하여야 하는지를 기술해야 합니다. 특히 데이터의 어떤 부분을 보호하고 또 어떤 사용자가 어떤 데이터 부분을 접근할 수 있는지를 결정해야 합니다. 그 다음으로 바탕이 되는 DBMS등의 보안 메커니즘을 활용하여 이 정책을 집행해야 합니다. 26 | 27 | --- 28 | 29 | link:./01-1_chapter1_security.adoc[이전: Chapter 1: 데이터베이스 보안] + 30 | link:./01-3_user_object.adoc[다음: User 개체] -------------------------------------------------------------------------------- /course/Module07_security_view/contents/01-3_user_object.adoc: -------------------------------------------------------------------------------- 1 | = User 개체 2 | 3 | * 데이터베이스 관리 시스템은 시스템에 대한 모든 권한을 가지는 관리 사용자를 가짐 4 | * DBMS에 따라 관리 사용자가 세분화되는 방식이 다름 5 | * 데이터베이스 관리 시스템은 데이터베이스의 사용자를 생성/관리 6 | * 운영체제와 통합되거나, 독립적으로 관리 7 | * 데이터베이스의 사용자는 데이터베이스에 대한 권한을 가짐 8 | * 사용자 생성 9 | 10 | [source, sql] 11 | ---- 12 | CREATE USER IDENTIFIED BY 13 | ---- 14 | 15 | --- 16 | 17 | 데이터베이스 관리 시스템은 설치될 때 DBMS에 대한 모든 권한을 가지는 관리 사용자를 생성합니다. 관리 사용자는 DBMS에 따라 세분화 될 수 있으며, 이는 DBMS마다 방식이 상이합니다. DBMS는 데이터에 대한 보안을 위해 사용자별로 액세스 할 수 있는 데이터에 대한 제한을 허용합니다. 18 | 19 | 데이터베이스 관리 시스템은 데이터베이스에서 사용자를 생성하고 관리할 수 있는 기능들을 지원합니다. 사용자는 데이터베이스 관리 시스템 내에서 독립적으로 운영관리되나, 때때로 운영체제와 통합되거나 또는 전사적인 디렉토리 서비스 시스템(예: Microsoft Active Directory)과 통합되기도 합니다. 데이터베이스의 사용자는 개체와 데이터에 대한 보안의 주체가 되며, 데이터베이스 개체에 대한 접근/삭제/갱신에 대한 권한이 부여됩니다. 20 | 데이터베이스 사용자는 아래와 같은 DDL 문으로 생성할 수 있습니다. 21 | 22 | [source, sql] 23 | ---- 24 | CREATE USER IDENTIFIED BY 25 | ---- 26 | 27 | --- 28 | 29 | link:./01-2_overview_security.adoc[이전: 데이터베이스 보안 개요] + 30 | link:./01-4_access_control.adoc[다음: 접근 제어] -------------------------------------------------------------------------------- /course/Module07_security_view/contents/01-lab7c.adoc: -------------------------------------------------------------------------------- 1 | = Lab 7-1c : 사용자 생성 및 권한 제어 (Oracle) 2 | 3 | 이 연습에서는 Oracle 데이터베이스에서 사용자 개체를 생성하고 권한을 부여합니다. 아래 절차에 따릅니다. 4 | 5 | --- 6 | 7 | link:./01-lab7b.adoc[다음: 연습 7-1b 사용자 생성 및 권한 제어 (Microsoft SQL Server)] + 8 | link:./01-lab7d.adoc[다음: 연습 7-1d 사용자 생성 및 권한 제어 (Postgres)] -------------------------------------------------------------------------------- /course/Module07_security_view/contents/01-lab7d.adoc: -------------------------------------------------------------------------------- 1 | = Lab 7-1d : 사용자 생성 및 권한 제어 (Postgres) 2 | 3 | 이 연습에서는 Postgres 데이터베이스에서 사용자 개체를 생성하고 권한을 부여합니다. 아래 절차에 따릅니다. 4 | 5 | --- 6 | 7 | link:./01-lab7c.adoc[이전: 연습 7-1b 사용자 생성 및 권한 제어 (Oracle)] + 8 | link:./02-1_chapter2_view.adoc[다음: Chapter 2: View] -------------------------------------------------------------------------------- /course/Module07_security_view/contents/02-1_chapter2_view.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: 뷰 2 | 3 | 뷰(View)는 저장장치에 물리적으로 존재하지 않지만 사용자에게 있는 것 처럼 간주되는, 하나 이상의 테이블로부터 유도된 가상의 테이블로, 데이터의 논리적 독립성을 제공하는 데이터베이스 개체입니다. 이 단원에서는 뷰에 대해 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./02-2_overview_view.adoc[뷰(View 개요)] 8 | 2. link:./02-3_view_creation.adoc[뷰 생성과 삭제] 9 | 3. link:./02-4_view_update.adoc[뷰에 대한 갱신] 10 | 11 | --- 12 | 13 | link:./01-lab7d.adoc[이전: Lab 7-1d : 사용자 생성 및 권한 제어 (Postgres)] + 14 | link:./02-2_overview_view.adoc[다음: 뷰 개요] -------------------------------------------------------------------------------- /course/Module07_security_view/contents/02-2_overview_view.adoc: -------------------------------------------------------------------------------- 1 | = 뷰(View) 개요 2 | 3 | * 관계 데이터베이스 관리 시스템의 매우 강력한 기능의 하나 4 | * 접근 제어를 향상시키며, 논리적 데이터 독립성을 제공함 5 | ** 데이터베이스 개념 스키마의 변경을 외부 사용자에게 감추는 역할 6 | ** 보안 관점에서만 작성된 개체 형태는 아님 7 | * 테이블과 같은 방식으로 동작하지만, 소속 투플이 실제로 데이터베이스에 저장된 것이 아님 8 | * 필요할 때 마다 뷰 정의에 따라 계산됨 9 | * 질의를 생성하거나 다른 뷰를 생성할 때 기본 뷰는 테이블과 같은 형태로 사용할 수 있음 10 | 11 | --- 12 | 13 | 뷰 메커니즘은 관계 데이터베이스 관리 시스템에서 매우 강력한 기능의 하나입니다. 뷰를 사용하면 접근 제어를 향상 시킬 수 있을 뿐만 아니라 논리적 데이터 독립성을 제공할 수 있습니다. 뷰는 개념 스키마의 변경을 사용자로부터 감추는 역할을 합니다. 보안 관점에서뿐만 아니라 여러 관점에서 다양하게 사용될 수 있습니다. 14 | 15 | 뷰는 일종의 테이블로, 소속 투플이 실제로 데이터베이스에 저장된 것이 아니라 필요할 때 뷰 정의에 따라 계산됩니다. 뷰는 사용자 관점에서 일반 테이블, 즉 실제로 데이터가 저장된 테이블처럼 사용할 수 있습니다. 16 | 17 | --- 18 | 19 | link:./02-1_chapter2_view.adoc[이전: Chapter 2: View] + 20 | link:./02-3_view_creation.adoc[다음: 뷰 생성과 삭제] -------------------------------------------------------------------------------- /course/Module07_security_view/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module07_security_view/images/image01.png -------------------------------------------------------------------------------- /course/Module07_security_view/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module07_security_view/images/image02.png -------------------------------------------------------------------------------- /course/Module07_security_view/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module07_security_view/images/image03.png -------------------------------------------------------------------------------- /course/Module07_security_view/readme.adoc: -------------------------------------------------------------------------------- 1 | link:./contents/00_security_view.adoc[Module 07 보안과 뷰] 2 | 3 | * link:./contents/01-1_chapter1_security.adoc[데이터베이스 보안] 4 | ** link:./contents/01-2_overview_security.adoc[데이터베이스 보안 개요] 5 | ** link:./contents/01-3_user_object.adoc[User 개체] 6 | ** link:./contents/01-4_access_control.adoc[접근 제어] 7 | ** link:./contents/01-5_dac.adoc[재량 접근 제어] 8 | ** link:./contents/01-6_privilege.adoc[특권] 9 | ** link:./contents/01-7_nece.adoc[필수 접근 제어] 10 | * link:./contents/01-lab7a.adoc[Lab 7-1a : 사용자 생성 및 권한 제어 (MySQL)] 11 | * link:./contents/01-lab7b.adoc[Lab 7-1b : 사용자 생성 및 권한 제어 (Microsoft SQL Server)] 12 | * link:./contents/01-lab7c.adoc[Lab 7-1c : 사용자 생성 및 권한 제어 (Oracle)] 13 | * link:./contents/01-lab7d.adoc[Lab 7-1d : 사용자 생성 및 권한 제어 (Postgres)] 14 | * link:./contents/02-1_chapter2_view.adoc[뷰] 15 | ** link:./contents/02-2_overview_view.adoc[뷰(View 개요)] 16 | ** link:./contents/02-3_view_creation.adoc[뷰 생성과 삭제] 17 | ** link:./contents/02-4_view_update.adoc[뷰에 대한 갱신] 18 | * link:./contents/02-lab7-2a.adoc[Lab 7-2 : 뷰의 생성과 사용 및 보안 설정 (MySQL)] -------------------------------------------------------------------------------- /course/Module08_sp_function_trigger/contents/00_introduction.adoc: -------------------------------------------------------------------------------- 1 | = Module 08: 저장 프로시저와 함수, 트리거 2 | 3 | SQL은 SQL 절차언어를 포함하여 SQL 문만으로 논리가 있는 루틴을 만드는 것을 지원합니다. 이 루틴을 사용하여 절차적 루틴인 프로시저와 함수적 루틴인 함수를 작성하고 사용할 수 있습니다. 이 모듈에서는 SQL 루틴의 개요에 대해 알아보고 저장 프로시저와 함수를 작성하고 사용하는 방법에 대해 알아봅니다. 4 | 5 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 6 | 7 | • SQL 루틴을 이해합니다. 8 | • 저장 프로시저를 만들고 사용합니다. 9 | • 함수를 만들고 사용합니다. 10 | • 트리거를 만들고 사용합니다. 11 | 12 | == Table of Contents 13 | 14 | 1. link:./02_chapter1_sql_routine.adoc[SQL 루틴] 15 | 2. 저장 프로시저 16 | 3. 함수 17 | 4. 트리거 18 | 19 | --- 20 | 21 | link:./02_chapter1_sql_routine.adoc[다음: SQL 루틴] 22 | -------------------------------------------------------------------------------- /course/Module08_sp_function_trigger/contents/01-1_chapter1_sql_routine.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: SQL 루틴 2 | 3 | SQL 루틴은 SQL 절차 언어를 포함하여 SQL statement 만으로만 로직이 구현되어 있는 루틴을 말합니다. SQL 루틴은 스키마에 포함될 수 있으며, SQL 루틴은 표준 SQL을 사용하여 다른 데이터베이스 개체와 마찬가지로 생성, 삭제, 수정될 수 있으며, SQL 프로시저, SQL 함수 및 메소드를 작성할 수 있습니다. 이 단원에서는 SQL 루틴에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./01-2_introduction_routine.adoc[SQL 루틴 개요] 8 | 2. link:./01-3_create_routine.adoc[SQL 루틴 생성] 9 | 3. link:./01-4_parameter.adoc[SQL 루틴 파라미터] 10 | 4. link:./01-5_call_routine.adoc[루틴 호출] 11 | 5. link:./01-6_return.adoc[RETURN] 12 | 6. link:./01-7_modify_routine.adoc[루틴 수정] 13 | 14 | --- 15 | 16 | link:./00_introduction.adoc[이전: Module 08 저장 프로시저와 함수, 트리거] + 17 | link:./01-2_introduction_routine.adoc[다음: SQL 루틴 개요] 18 | -------------------------------------------------------------------------------- /course/Module08_sp_function_trigger/contents/01-6_return.adoc: -------------------------------------------------------------------------------- 1 | = RETURN 문 2 | 3 | * 함수에서 값을 return 4 | * SQL 함수의 실행을 종료하고 함수의 결과를 반환 5 | * return 값은 이거나 NULL 일 수 있음 6 | 7 | [source, sql] 8 | ---- 9 | RETURN | NULL 10 | ---- 11 | 12 | --- 13 | 14 | SQL 루틴에서 함수는 반드시 값을 반환해야 합니다. 값을 반환하기 위해 RETURN 문을 사용합니다. SQL-99 표준 구문은 아래와 같습니다. 15 | 16 | [source, sql] 17 | ---- 18 | RETURN | NULL 19 | ---- 20 | 21 | RETURN 문은 SQL 함수의 실행을 종료하고 함수의 결과를 즉시 return 합니다. return 되는 값은 이거나, return 되는 결과가 null일 경우 키워드 NULL을 사용합니다. 22 | 23 | --- 24 | 25 | link:./01-5_call_routine.adoc[이전: 루틴 호출] + 26 | link:./01-7_modify_routine.adoc[다음: SQL 루틴 수정과 삭제] -------------------------------------------------------------------------------- /course/Module08_sp_function_trigger/contents/01-lab8-1c.adoc: -------------------------------------------------------------------------------- 1 | = Lab 8-1c: Oracle에서 SQL 루틴 작성 2 | 3 | 이 연습에서는 Microsoft SQL Server에서 SQL 루틴을 작성하고 호출합니다. 이 연습에서는 아래와 같은 릴레이션 스키마를 가진 데이터베이스를 사용합니다. 4 | 5 | _Users(UserNo:Integer, UserID:String, UserName:String, UserEmail:String, UserNickName:String) + 6 | Board(BoardNo:Integer, BoardName:String, Description:String, CreateDate:Date) + 7 | Article(ArticlaNo:Integer, Title:String, Contents:String, WriteDate:Date, UpdateDate:Date)_ 8 | 9 | 데이터베이스 생성 스크립트는 아래에서 다운로드 할 수 있습니다. 10 | 11 | --- 12 | 13 | link:./01-lab8-1b.adoc[이전: Microsoft SQL Server에서 SQL 루틴 작성] + 14 | link:./01-lab8-1d.adoc[다음: Postgres에서 SQL 루틴 작성] -------------------------------------------------------------------------------- /course/Module08_sp_function_trigger/contents/01-lab8-1d.adoc: -------------------------------------------------------------------------------- 1 | = Lab 8-3 PostgreSQL에서 SQL 루틴 작성 2 | 3 | 이 연습에서는 PostgreSQL에서 SQL 루틴을 작성하고 호출합니다. 이 연습에서는 아래 릴레이션과 같은 스키마를 가진 데이터베이스를 사용합니다. 4 | 5 | _Users(UserNo:Integer, UserID:String, UserName:String, UserEmail:String, UserNickName:String) + 6 | Board(BoardNo:Integer, BoardName:String, Description:String, CreateDate:Date) + 7 | Article(ArticlaNo:Integer, Title:String, Contents:String, WriteDate:Date, UpdateDate:Date)_ 8 | 9 | 데이터베이스 생성 스크립트는 아래에서 다운로드 할 수 있습니다. 10 | 11 | https://github.com/gikpreet/class-relational_database/blob/main/Module%2008%20%EC%A0%80%EC%9E%A5%20%ED%94%84%EB%A1%9C%EC%8B%9C%EC%A0%80%EC%99%80%20%ED%95%A8%EC%88%98/code/Table_creation_postgres.sql 12 | 13 | 아래 절차에 따릅니다. 14 | 15 | 1. pgAdmin(또는 PostgreSQL에 접근하여 실행 가능한 도구)를 실행하고 Module08 데이터베이스 접속합니다. 16 | 17 | == 파라미터 없는 프로시저 작성 18 | 19 | 1. 아래 SQL을 실행하여 Board 테이블의 모든 데이터를 조회하는 함수를 작성합니다. 20 | 21 | _**참고** - PostgreSQL은 저장 프로시저에서 Relation을 반환하는 메커니즘을 제공하지 않습니다._ 22 | 23 | --- 24 | 25 | link:./01-lab8-1c.adoc[이전: Oracle에서 SQL 루틴 작성] 26 | -------------------------------------------------------------------------------- /course/Module08_sp_function_trigger/readme.adoc: -------------------------------------------------------------------------------- 1 | link:./contents/00_introduction.adoc[Module 08 저장 프로시저와 함수] 2 | 3 | * link:./contents/01-1_chapter1_sql_routine.adoc[SQL 루틴] 4 | ** link:./contents/01-2_introduction_routine.adoc[SQL 루틴 개요] 5 | ** link:./contents/01-3_create_routine.adoc[SQL 루틴 생성] 6 | ** link:./contents/01-4_parameter.adoc[SQL 루틴 파라미터] 7 | ** link:./contents/01-5_call_routine.adoc[루틴 호출] 8 | ** link:./contents/01-6_return.adoc[RETURN 문] 9 | ** link:./contents/01-7_modify_routine.adoc[루틴 수정] 10 | * link:./contents/01-lab8-1a.adoc[Lab 8-1a: MySQL에서 SQL 루틴 작성] 11 | * link:./contents/01-lab8-1b.adoc[Lab 8-1b: Microsoft SQL Server 에서 SQL 루틴 작성] 12 | * link:./contents/01-lab8-1c.adoc[Lab 8-1c: Oracle에서 SQL 루틴 작성] 13 | * link:./contents/01-lab8-1d.adoc[Lab 8-1d: Postgres에서 SQL 루틴 작성] 14 | -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/Readme.adoc: -------------------------------------------------------------------------------- 1 | Module 08 영구 저장 모듈(PSM)과 호출 루틴 2 | 3 | -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/code/mssql_function.sql: -------------------------------------------------------------------------------- 1 | USE Module06 2 | GO 3 | 4 | CREATE FUNCTION GetDepartureDate ( 5 | @no int 6 | ) RETURNS datetime 7 | AS 8 | BEGIN 9 | DECLARE @returnvalue datetime 10 | SELECT @returnvalue = FlightDate 11 | FROM Flight 12 | WHERE FlightNo = @no; 13 | RETURN @returnvalue 14 | END 15 | GO 16 | 17 | SELECT dbo.GetDepartureDate(1) -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/code/mssql_stored_procedure.sql: -------------------------------------------------------------------------------- 1 | CREATE PROCEDURE GetPassengerByFlight 2 | @no int 3 | AS 4 | SELECT PassengerName, Age, Grade 5 | FROM Passenger INNER JOIN Reservation ON Passenger.PassengerNo = Reservation.PassengerNo 6 | INNER JOIN Flight ON Flight.FlightNo = Reservation.FlightNo 7 | WHERE Flight.FlightNo = @No 8 | GO 9 | 10 | EXEC GetPassengerByFlight 1 -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/code/mysql_function.sql: -------------------------------------------------------------------------------- 1 | USE Module06; 2 | 3 | # 옵션 지정 4 | SET GLOBAL log_bin_trust_function_creators = 1; 5 | 6 | DELIMITER $$ 7 | CREATE FUNCTION GetDepartureDate(no int) 8 | RETURNS datetime 9 | BEGIN 10 | DECLARE returnvalue datetime; 11 | SET returnvalue = now(); 12 | SELECT FlightDate into returnvalue 13 | FROM Flight 14 | WHERE FlightNo = no; 15 | 16 | RETURN returnvalue; 17 | END $$ 18 | DELIMITER ; 19 | 20 | SELECT GetDepartureDate(1); -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/code/mysql_stored_procedure.sql: -------------------------------------------------------------------------------- 1 | use Module06; 2 | 3 | DELIMITER $$ 4 | CREATE PROCEDURE GetPassengerByFlight ( 5 | no int 6 | ) 7 | BEGIN 8 | SELECT PassengerName, Age, Grade 9 | FROM Passenger NATURAL JOIN Reservation NATURAL JOIN Flight 10 | WHERE FlightNo = no; 11 | END $$ 12 | DELIMITER ; 13 | 14 | 15 | CALL GetPassengerByFlight(1); -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/contents/01_introduction.adoc: -------------------------------------------------------------------------------- 1 | = 영구 저장 모듈(Persistant Stored Module)과 호출 루틴(Invoked routine) 2 | 3 | Persistant Stored Module(PSM - 영구 저장 모듈)은 SQL에서 사용되고 저장되어 영구적으로 사용할 수 있는 모듈을 의미하며, 데이터베이스 관리 시스템은 이런 필수적이지는 않지만 유용한 PSM을 위한 SQL 확장을 제공합니다. SQL Invoked routine(SQL 호출 루틴 또는 SQL 루틴)은 4 | 5 | 데이터베이스에서 변수를 선언하고 변수에 값을 할당하며, 반복을 수행하고 실행 흐름을 제어하며, 이를 완전한 모듈로 만들어 재사용할 수 있는 작업이 필요할 수 있습니다. 하지만 다른 프로그래밍 언어가 제공하는 모든 작업을 수행할 수 있는 완전한 SQL 언어의 구현은 없습니다. 6 | 7 | PSM을 사용하면 이런 SQL에서의 부족함을 극복할 수 있습니다. 기본적으로 PSM은 SQL에서 반드시 구현해야 하는 필수적인 것은 아니지만, DBMS들은 각자의 구현으로 이런 PSM을 위한 SQL 확장을 구현했고, 이를 사용하여 SQL에서의 부족함을 극복할 수 있습니다. 기존적으로 PSM은 8 | 9 | • 저장 프로시저를 사용하여 절차적인 처리를 프로시저로 추상화하고 성능을 높이는 방법을 알게 됩니다. 10 | • 트리거를 사용하여 한 구문이 수행되었을 때를 위한 연속적인 동작을 구성할 수 있습니다. 11 | • 커서를 사용하여 산출되는 투플에 대한 반복을 처리할 수 있습니다. 12 | 13 | == Table of Contents 14 | 15 | 1. Persistant Stored Module 16 | 2. 트리거 17 | 3. 커서 18 | 19 | link:./02_psm.adoc[다음: Persistant Stored Module] -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/contents/02_psm.adoc: -------------------------------------------------------------------------------- 1 | = Persistant Stored Module 2 | 3 | Persistant Stored Module(PSM - 영구 저장 모듈)은 SQL에서 사용되고 저장되어 영구적으로 사용할 수 있는 모듈을 의미합니다. 4 | 5 | 데이터베이스에서 변수를 선언하고 변수에 값을 할당하며, 반복 또는 if/then을 사용하여 실행 흐름을 제어하고 이를 완전한 모듈로 만드는 것은 필요한 작업이지만, 다른 프로그래밍 언어가 제공하는 모든 작업을 수행할 수 있는 완전한 SQL언어의 구현은 없습니다. 6 | 7 | PSM을 사용하면 이런 SQL에서의 부족함을 극복할 수 있습니다. 기본적으로 PSM은 SQL에서 반드시 구현해야 하는 필수적인 것은 아니지만, DBMS들은 각자의 구현으로 이런 PSM을 위한 SQL 확장을 구현했습니다. 이 단원에서는 8 | 9 | == Table of Contents 10 | 11 | 1. Persistent Stored Module 개요 12 | 2. CREATE Module statement 13 | 3. ALTER Module statement 14 | 4. DROP Module statement 15 | 16 | link:./03_Lab8_1.adoc[다음: Lab 8-1 실습환경 구성] -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/contents/04_introduction_psm.adoc: -------------------------------------------------------------------------------- 1 | = Persistant Stored Module 소개 2 | 3 | -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/contents/04_stored_procedure.adoc: -------------------------------------------------------------------------------- 1 | = 저장 프로시저 2 | 3 | 많은 데이터베이스 시스템은 데이터 처리에 필요한 문장들을 하나의 절차로 묶어서 처리할 수 있는 저장 프로시저를 제공합니다. 저장 프로시저를 사용하면 특정 데이터 처리 작업을 추상화하여 프로시저화 할 수 있으며, 처리 속도를 개선할 수 있습니다. 4 | 5 | == Table of Contents 6 | 7 | 1. 저장 프로시저 개요 8 | 2. 저장 프로시저의 장/단점 9 | 3. 저장 프로시저 생성/수정/삭제 10 | 4. 저장 프로시저 실행 11 | 5. 문 유형 12 | 13 | link:./03_introduction_stored_procedure.adoc[다음: 저장 프로시저 소개] -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/contents/05_flow_control.adoc: -------------------------------------------------------------------------------- 1 | = 흐름 제어 2 | 3 | -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/contents/05_introduction_stored_procedure.adoc: -------------------------------------------------------------------------------- 1 | = 저장 프로시저 개요 2 | 3 | * 데이터베이스에 저장되는 프로시저 4 | * 일련의 쿼리를 하나의 함수처럼 실행하기 위한 쿼리의 집합 5 | * 프로시저의 이름, 파라미터 목록과 SQL Statement를 가짐 6 | * 파라미터, 출력 파라미터, 리턴 값을 사용할 수 있어 활용도가 높음 7 | * 구문 분석 및 내부 중간 코드 변환 단계를 거치지 않아 일반적으로 SQL 구문보다 빠름 8 | * View는 DML 문장만을 수행하여 릴레이션을 반환하는데 국한되지만, 저장 프로시저는 처리를 위한 단계를 포함할 수 있음 9 | 10 | --- 11 | 12 | 13 | -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/contents/loop_statement.adoc: -------------------------------------------------------------------------------- 1 | = 반복문 2 | 3 | PL/SQL(Oracle) 4 | 5 | [source, sql] 6 | ---- 7 | DECLARE NUM1 NUMBER :=1; 8 | 9 | BEGIN 10 | WHILE(NUM1 <= 10) --NUM 10보다 작을때까지 LOOP실행 11 | LOOP 12 | DBMS_OUTPUT.PUT_LINE(NUM1); 13 | NUM1 := NUM1+1; --NUM = NUM +1 14 | END LOOP; 15 | END; 16 | ---- 17 | 18 | T-SQL(MS-SQL Server) 19 | [source, sql] 20 | ---- 21 | DECLARE @i int 22 | SELECT @i = 0 23 | 24 | BEGIN 25 | WHILE(@i < 10) 26 | BEGIN 27 | PRINT(@i) 28 | SELECT @i = @i + 1 29 | END 30 | END 31 | ---- 32 | 33 | MySQL (Stored Procedure) 34 | [source, sql] 35 | ---- 36 | DELIMITER $$ 37 | CREATE PROCEDURE whiletest() 38 | BEGIN 39 | DECLARE i int; 40 | WHILE i < 10 DO 41 | SELECT i; 42 | SET i = i + 1; 43 | END WHILE; 44 | SELECT 'a'; 45 | END $$ 46 | DELIMITER ; 47 | ---- -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module09_persistant_stored_module/images/image01.png -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module09_persistant_stored_module/images/image02.png -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module09_persistant_stored_module/images/image03.png -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module09_persistant_stored_module/images/image04.png -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module09_persistant_stored_module/images/image05.png -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module09_persistant_stored_module/images/image06.png -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module09_persistant_stored_module/images/image07.png -------------------------------------------------------------------------------- /course/Module09_persistant_stored_module/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module09_persistant_stored_module/images/image08.png -------------------------------------------------------------------------------- /course/Module10_er_model/contents/00_introduction.adoc: -------------------------------------------------------------------------------- 1 | = Module 10: 개념적 설계와 ER 모델 2 | 3 | 데이터베이스 설계는 조직에 필요한 데이터를 어떻게 구조화하고 사용할 것인지를 결정하는 관계형 데이터베이스에서 가장 중요한 작업 중의 하나입니다. 데이터베이스의 설계는 데이터의 조직과 조직된 정보의 활용, 데이터의 품질뿐만 아니라 데이터베이스의 성능에도 크게 영향을 미칩니다. 이 모듈에서는 개체-관계 모델(ER Model, Entity-Relationship Model)을 사용하여 데이터베이스를 개념적으로 설명하는 방법에 관해 공부합니다. 4 | 5 | 이 단원에서는 관계 데이터베이스의 설계 개요에 대해 알아보고, 개념 모델링, 논리 모델링, 논리 모델링 및 튜닝으로 이어지는 데이터베이스 설계 프로세스에 대해 공부합니다. 6 | 7 | 이 단원을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 8 | 9 | * 관계형 데이터베이스 설계의 주요 프로세스를 설명할 수 있습니다. 10 | * 개체 관계 모델(ER 모델)을 이해하고 주요 설계 방법을 설명할 수 있습니다. 11 | * 개체 관계 모델을 사용하여 관계형 데이터베이스를 설계할 수 있습니다. 12 | * 개념적 데이터베이스 설계 단계에서 고려해야 할 사항들을 이해합니다. 13 | 14 | == Table of contents 15 | 16 | 1. link:./01-1_chapter1_design_overview.adoc[관계형 데이터베이스 설계 개요] 17 | 2. link:./02-1_chapter2_ER_model.adoc[ER 모델] 18 | 3. link:./03-1_chapter3_er_model_function.adoc[ER 모델의 기타 기능] 19 | 4. link:./04-1_chapter4_conceptural_design.adoc[개념적 설계 고려사항] 20 | 21 | --- 22 | 23 | link:./01-1_chapter1_design_overview.adoc[다음: Chapter 1: 데이터베이스 설계 개요] -------------------------------------------------------------------------------- /course/Module10_er_model/contents/01-1_chapter1_design_overview.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: 데이터베이스 설계 2 | 3 | 관계 데이터베이스 설계는 데이터를 구조화하고, 이를 효율적으로 관리할 수 있도록 논리적이고 물리적인 구조를 결정하는 과정입니다. 설계 과정은 데이터베이스의 성능, 일관성, 확장성에 큰 영향을 미칩니다. 4 | 5 | 이 단원에서는 관계 데이터베이스의 설계 개요에 대해 알아보고, 개념 모델링, 논리 모델링, 논리 모델링 및 튜닝으로 이어지는 데이터베이스 설계 프로세스에 대해 공부합니다. 6 | 7 | == Table of Contents 8 | 9 | 1. link:./01-2_design_overview.adoc[데이터베이스 설계 개요] 10 | 2. link:./01-3_requirement_analysis.adoc[요건 분석] 11 | 3. link:./01-4_conceptual_design.adoc[개념 설계] 12 | 4. link:./01-5_logical_design.adoc[논리 설계] 13 | 5. link:./01-6_schema_refine.adoc[스키마 정제] 14 | 6. link:./01-7_physical_design.adoc[물리 설계] 15 | 16 | --- 17 | 18 | link:./00_introduction.adoc[이전: Module 10: Module 10: 개념적 설계와 ER 모델] + 19 | link:./01-2_design_overview.adoc[다음: 관계 데이터베이스 설계 개요] -------------------------------------------------------------------------------- /course/Module10_er_model/contents/01-2_design_overview.adoc: -------------------------------------------------------------------------------- 1 | = 관계 데이터베이스 설계 개요 2 | 3 | image:../images/image01.png[] 4 | 5 | --- 6 | 7 | 데이터베이스를 설계할 때 가장 먼저 해야 할 일은 그 조직체에서 데이터베이스에 어떠한 정보를 저장해야 하는가와 그 데이터에 어떠한 무결성 제약조건 또는 규칙을 적용해야 하는가를 이해하는 것입니다. 이런 첫 단계를 **요건 분석(Requirement Analysis)**이라고 하는데, 사용자 그룹과의 토론, 현행 운용 환경과 앞으로의 변화 전망에 대한 연구 검토, 이 데이터베이스를 활용하게 될 기존 응용들에 대한 분석등과 같이 비공식적인 과정을 거칩니다. 이 과정에서 모든 정보들을 사용해서 데이터베이스에 저장할 데이터와 이 데이터에서 지켜 주어야 할 제약조건들을 고수준에서 기술하게 되는데, 이 단계를 **개념적 설계(Conceptual Design)**라고 합니다. ER 모델이 데이터를 고도의 추상적인 형태로 기술할 수 있도록 해 주기 때문에 개념적 설계를 할 때에는 ER 모델을 자주 사용합니다. ER 모델을 직접 지원할 수 있는 데이터베이스 시스템은 없기 때문에, 관계형 데이터베이스 관리 시스템을 사용한다면 구축된 ER 모델 명세 내용을 여러 릴레이션의 집단으로 변환해 주어야 합니다. 8 | 9 | 설계 과정상의 두 번째 단계는 무결성 제약 조건에 관한 모든 가용한 정보들을 고려해서 이 릴레이션 집합을 정제하는 일입니다. 이 단계를 **스키마 정제(Schema Refinement)**라고 합니다. 첫 번째 단계인 개념적 설계 단계는 기본적으로 주관적인 단계임에 비하여 스키마 정제는 어떤 세련되고 강력한 이론을 통해 방향을 잡을 수 있습니다. 이 이론이 릴레이션의 **정규화(Normalization)**로서, 릴레이션들이 바람직한 성질을 갖도록 재조직하는 방식입니다. 10 | 11 | 데이터베이스 설계의 세 번째 단계는 **물리적 데이터베이스 설계(Physical Database Design)**입니다. 이 단계에서는 먼저 데이터베이스가 지원해 주어야 할 예상 작업 부하를 고려해 주어야 하고, 그 이우호를 차차 데이터베이스 설계를 정제하여 원하는 성능 기준에 맞도록 해 주어야 합니다. 이 단계를 단순화해서 생각한다면 릴레이션 몇 개에 인덱스를 구축한다거나 앞의 두 설계 단계에서 구축된 데이터베이스 스키마를 부분적으로 재설계하는 등의 작업입니다. 12 | 13 | 처음부터 순서대로 개념적 설계, 스키마 정제, 물리적 설계를 수행해 나간다 하더라도 결국은 그 후에 이 세 종류의 설계 단계를 반복적으로 교차 수행하는 **조정(Tuning, 튜닝)** 과정을 거쳐야 합니다. 14 | 15 | --- 16 | 17 | link:./01-1_chapter1_design_overview.adoc[이전: Module 10: 개념적 설계와 ER 모델] + 18 | link:./01-3_requirement_analysis.adoc[다음: 요건 분석] -------------------------------------------------------------------------------- /course/Module10_er_model/contents/02-1_chapter2_ER_model.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: 개체 관계 데이터모델 2 | 3 | ER 모델이라고 부르는 개체 관계 데이터모델은 개체(Entity), 애트리뷰트(Attribute), 관계(Relationship)을 사용하여 데이터베이스를 모델링하는 기법의 총칭입니다. 이 단원에서는 개체 관계 모델에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./02-2_er_model.adoc[개체 관계 데이터 모델] 8 | 2. link:./02-3_entity_attribute_entityset.adoc[개체, 속성, 개체 집합] 9 | 3. link:./02-4_relation_relationshipset.adoc[관계, 관계 집합] 10 | 11 | --- 12 | 13 | link:./01-1_chapter1_design_overview.adoc[이전: Chapter 1: 데이터베이스 설계] + 14 | link:./02-2_er_model.adoc[다음: 개체 관계 데이터모델] -------------------------------------------------------------------------------- /course/Module10_er_model/contents/02-2_er_model.adoc: -------------------------------------------------------------------------------- 1 | = 개체 관계 데이터모델 2 | 3 | * 데이터를 개체(Entity), 속성(Attribute), 관계(Relationship)로 나타내는 데이터 모델 4 | * 실 세계를 개체(Entity)라 불리는 기본 객체들과 그 객체들 사이의 관계로 인식 5 | * 데이터베이스의 전체 논리적 구조를 나타내는 조직의 스키마(Enterprise Schema)를 명시함으로써 데이터베이스를 쉽게 설계하도록 개발됨 6 | * 실세계의 조직의 의미와 상호작용을 개념적 스키마로 나타내는데 매우 유용함 7 | 8 | --- 9 | 10 | ER 데이터 모델의 기반이 되는 개념은 개체(Entity), 속성(Attribute), 관계(Relationship)입니다. ER 모델에서는 실 세계를 개체(Entity)라고 부르는 기본 객체들과 그 객체들 사이의 관계로 인식합니다. 개체 관계 모델에서는 데이터베이스의 전체적인 논리 구조를 나타내는 조직의 스키마를 명시함으로써 데이터베이스를 쉽게 설계할 수 있도록 합니다. 11 | 12 | ER 모델은 실세계의 조직의 의미와 상호 작용을 개념적 스키마로 나타내는데 매우 유용합니다. 13 | 14 | --- 15 | 16 | link:./02-1_chapter2_ER_model.adoc[이전: Chapter 1: 개체 관계 데이터모델] + 17 | link:./02-3_entity_attribute_entityset.adoc[다음: 개체, 속성, 개체 집합] -------------------------------------------------------------------------------- /course/Module10_er_model/contents/03-1_chapter3_er_model_function.adoc: -------------------------------------------------------------------------------- 1 | = ER 모델 기능 2 | 3 | ER 모델은 데이터의 중요한 특징들을 표현할 수 있는 요소들을 가지고 있습니다. 그 기능들을 사용하면 모델링하려는 조직체의 여러 가지 의미를 관계 모델보다 더 잘 설명할 수 있고, 이는 관계형 데이터베이스 설계에 ER 모델을 사용하는 주된 이유이기도 합니다. 이 단원에서는 ER 모델의 기능들에 대해 살펴봅니다 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03-2_mapping_cadinality.adoc[대응 수] 8 | 2. link:./03-3_key_constraint.adoc[키 제약조건] 9 | 3. link:./03-4_participation_constraint.adoc[참여 제약 조건] 10 | 4. link:./03-5_weakly_entityset.adoc[약 개체 집합] 11 | 5. link:./03-6_specialization.adoc[전문화와 일반화] 12 | 13 | --- 14 | 15 | link:./02-4_relation_relationshipset.adoc[이전: 관계, 관계 집합] + 16 | link:./03-2_mapping_cadinality.adoc[다음: 대응 수] -------------------------------------------------------------------------------- /course/Module10_er_model/contents/04-1_chapter4_conceptural_design.adoc: -------------------------------------------------------------------------------- 1 | = 개념적 설계 고려사항 2 | 3 | 데이터베이스 설계의 첫 단계는 모델링할 조직체와 저장할 정보를 이해하는 것입니다. 설계자가 데이터와 그 사용형태에 대해 숙지한 후 ER 모델등을 사용하여 개념적 설계를 수행하게 됩니다. 이 단원에서는 개념 설계 단계에서 ER 다이어그램을 구성할 때 염두에 두어야 할 사항들을 학습합니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./04-2_cd_using_er_model.adoc[ER 모델을 이용한 개념적 설계] 8 | 2. link:./04-3_entity_or_attribute.adoc[개체 or 속성] 9 | 3. link:./04-4_entity_or_relationship.adoc[개체 or 관계] 10 | 4. link:./04-5_binary_or_triage.adoc[이진 관계 or 삼진 관계] 11 | 12 | --- 13 | 14 | link:./03-6_specialization.adoc[이전: Chapter 4: 전문화와 일반화] + 15 | link:./04-2_cd_using_er_model.adoc[다음: ER 모델을 이용한 개념적 설계] -------------------------------------------------------------------------------- /course/Module10_er_model/contents/04-2_cd_using_er_model.adoc: -------------------------------------------------------------------------------- 1 | = ER 모델을 이용한 개념적 설계 2 | 3 | * ER 다이어그램 개발 과정은 선택의 연속 4 | * ER 다이어그램은 데이터를 최대한 비슷하게 설명할 뿐, 모든 의미를 다 표현할 수 없음 5 | * ER 모델링은 스키마 설계에 대한 완벽한 방법이 아님 6 | 7 | --- 8 | 9 | 데이터베이스 설계의 제일 처음 단계는 모델링할 조직체와 저장할 정보를 이해하는 것입니다. 일단 설계자가 데이터와 그 사용 형태에 대해서 숙지하고 나면 ER 모델링등의 설계 방법을 이용하여 개념적 설계를 수행하게 됩니다. ER 다이어그램을 구성할 때 고려해야할 몇 가지 사항들은 아래와 같습니다. 10 | 11 | 1. ER 다이어그램 개발 과정은 선택의 연속이다. 12 | 2. ER 다이어그램은 데이터를 최대한 비슷하게 설명할 뿐이며 요구되는 모든 의미를 다 표현할 수는 없다. 13 | 3. ER 모델링은 데이터 설계에 대한 완벽한 방식이 아니며, ER 다이어그램을 변환하여 얻은 릴레이션은 스키마 정제가 필요하다. 14 | 15 | --- 16 | 17 | link:./04-1_chapter4_conceptural_design.adoc[이전: Chapter 4: 개념적 설계 고려사항] + 18 | link:./04-3_entity_or_attribute.adoc[다음: 개체 or 속성] -------------------------------------------------------------------------------- /course/Module10_er_model/contents/04-4_entity_or_relationship.adoc: -------------------------------------------------------------------------------- 1 | = 개체 or 관계 2 | 3 | * 개체로 모델링하는 경우 4 | ** 관계가 관계로 생성되는 한 개체에 국한되는 속성을 가짐 5 | ** A 개체집합의 개체가 정확히 B 개체집합의 한 개체에만 해당 6 | * 관계로 모델링 하는 경우 7 | ** 관계집합에서 중복이 발생하는 경우 8 | ** 두 개체 사이에 일어나는 동작을 기술하는 경우 9 | 10 | --- 11 | 12 | 아래와 같은 관리 관계집합을 생각해봅시다. 각 부서의 부서장은 예산을 가지고 있습니다. 13 | 14 | image:../images/image12.png[] 15 | 16 | 한 부서에는 한 명의 관리자가 있지만, 한 관리자는 여러 부서를 관리할 수 있는 경우, 관리 관계집합에 부임일자와 예산을 저장합니다. 요구사항이 여기까지 라면 설계는 자연스럽습니다. 17 | 18 | 예산액에 부서별로 할당되는 것이 아니라, 관리자에게 할당되는 경우라고 생각하면, 관리 관계집합에는 예산이 같은 값으로 저장됩니다. 이런 중복성은 일반적으로 매우 중요하며, 중복된 데이터는 여러 문제를 일으킬 수 있습니다. 19 | 20 | 이런 경우, 직원을 부서 그룹의 관리자로 입명하고 그에 대해 예산을 책정하여 해결할 수 있습니다. 임명 내용을 관리자임명이라는 개체 집합으로 모델링하고 관리자, 부서를 3진관계로 연관시킵니다. 임명에 대한 세부 내용(부임일, 예산 등)은 임명에 속한 각 부서에 대해 반복되지 않습니다. 21 | 22 | image:../images/image13.png[] 23 | 24 | --- 25 | 26 | link:./04-3_entity_or_attribute.adoc[이전: 개체 or 속성] + 27 | link:./04-5_binary_or_triage.adoc[다음: 이진관계 or 삼진관계] -------------------------------------------------------------------------------- /course/Module10_er_model/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image01.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image02.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image03.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image04.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image05.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image06.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image07.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image08.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image09.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image10.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image11.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image12.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image13.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image14.png -------------------------------------------------------------------------------- /course/Module10_er_model/images/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module10_er_model/images/image15.png -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/contents/00_schema_refine.adoc: -------------------------------------------------------------------------------- 1 | = Module 10: 스키마 정제와 정규형 2 | 3 | 개념 설계 단계를 거치면 릴레이션 스키마의 집합과 무결성 제약 조건이 산출되어, 최종적인 데이터베이스 설계 내역을 만들어 낼 수 있게 됩니다. 초기 설계 내역은 무결성 제약조건들을 ER 모델에서 가능했던 것 보다 면밀하게 정제해 주어야 합니다. 이 단원에서는 개념적 스키마를 정제하는 법을 살펴봅니다. 4 | 5 | 이 장을 마치면, 다음과 같은 것들을 할 수 있게 됩니다: 6 | 7 | * 데이터베이스 설계 단계에서 스키마 정제 단계를 이해하게 됩니다. 8 | * 함수 종속에 대해 이해하고 설명할 수 있습니다. 9 | * 정규형을 식별하고 위반을 검출할 수 있습니다. 10 | * 각각의 정규형을 정의할 수 있습니다. 11 | * 정규화를 수행하여 정규형을 만들어 낼 수 있습니다. 12 | * 정규화 단계에 대해 설명할 수 있습니다. 13 | 14 | == Table of contents 15 | 16 | 1. link:./01-1_chapter1_introduction_to_schema_refine.adoc[스키마 정제] 17 | 2. link:./02-1_chapter2_normalization_and_nf.adoc[정규화와 정규형] 18 | 3. link:./03-1_chapter3_decomposition.adoc[분해] 19 | 20 | --- 21 | 22 | link:./01-1_chapter1_introduction_to_schema_refine.adoc[다음: 스키마 정제 개요] 23 | -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/contents/01-1_chapter1_introduction_to_schema_refine.adoc: -------------------------------------------------------------------------------- 1 | = 스키마 정제 개요 2 | 3 | 개념 설계에서 표현하지 못하는 문제들은 스키마 정제를 통해 해결할 수 있습니다. 정보를 중복해서 저장하는 것이 이러한 문제의 근본 원인이 되는데, 여기에서는 분해를 이용해 이 문제들과 그 에서 비롯되는 또 다른 문제를 해결하는 방법을 학습합니다. 4 | 5 | == Table of Contents 6 | 1. link:./01-2_introduction_to_schema_refine.adoc[스키마 정제 개요] 7 | 2. link:./01-3_decomposition.adoc[분해법] 8 | 3. link:./01-4_functional_dependency.adoc[함수 종속] 9 | 4. link:./01-5_schema_refine.adoc[스키마 정제] 10 | 5. link:./01-6_functional_dependency.adoc[함수 종속 이해] 11 | 12 | --- 13 | 14 | link:./00_schema_refine.adoc[이전: Module 11: 스키마 정제와 정규형] + 15 | link:./01-2_introduction_to_schema_refine.adoc[다음: 스키마 정제 개요] -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/contents/02-1_chapter2_normalization_and_nf.adoc: -------------------------------------------------------------------------------- 1 | = 정규화와 정규형 2 | 3 | 어떤 릴레이션 스키마가 주어지면, 스키마의 설계가 올바른지 아니면 여러 개의 더 작은 릴레이션들로 분해하여야 하는지 판단하여야 합니다. 이에 대한 판단 기준으로 정규형들이 제안되었으며, 해당 릴레이션이 어떤 정규형에 속하는지에 따라 어떤 문제를 일으킬 수 있는지 알 수 있습니다. 이 단원에서는 정규형으로 릴레이션을 분해하는 과정인 정규화에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. 정규화(Normalization) 8 | 2. 제 1정규형(First Normal Form) 9 | 3. 제 2정규형(Second Normal Form) 10 | 4. 제 3정규형(Third Normal Form) 11 | 5. BCNF(Boyce-Code Normal Form) 12 | 13 | --- 14 | 15 | link:./01-6_functional_dependency.adoc[이전: 함수 종속 이해] + 16 | link:./02-2_normalization.adoc[다음: 정규화] -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/contents/02-3_1nf.adoc: -------------------------------------------------------------------------------- 1 | = 제 1정규형(First Normal Form) 2 | 3 | * 도메인의 원소들이 나눌 수 없는 단위로 되어 있을 때 그 도메인은 원자적(Atomic)이라고 함 4 | * 어떤 릴레이션 R에속한 모든 도메인이 원자적일 때 R은 제 1정규형(1NF)에 속함 5 | 6 | --- 7 | 8 | 제 1정규형은 다른 정규형과는 달리 릴레이션에 대해 기본적인 요건만을 요구하며, 함수 종속 등의 다른 부가적인 정보를 요구하지 않습니다. 9 | 10 | 도메인의 원소들이 나눌 수 없는 단위로 되어 있을 때, 그 도메인은 원자적(Atomic)이라고 합니다. 릴레이션 스키마 R의 모든 원소들의 도메인이 원자적일 때 R이 제 1정규형(1NF)에 속한다고 합니다. 11 | 아래 릴레이션과 같이 한 도메인이 여러 값을 포함하고 있을 때, 이 집합은 원자적이지 않습니다. 12 | 13 | [%header, cols="1,2,2,2,2" width=60%] 14 | |=== 15 | |학번 |지도교수 |학과 |과목번호 |성적 16 | |100 |이순신 |컴퓨터공학과 |C102, D103 |A, B 17 | |200 |홍길동 |컴퓨터공학과 |C102 |B 18 | |300 |윤동주 |기계공학과 |D102 |A 19 | |400 |김영랑 |수학과 |F201 |C 20 | |=== 21 | 22 | 아래와 같이 릴레이션에 속한 모든 도메인이 원자적이면, 이 릴레이션은 제 1정규형에 속합니다. 23 | 24 | [%header, cols="1,2,2,2,2" width=60%] 25 | |=== 26 | |학번 |지도교수 |학과 |과목번호 |성적 27 | |100 |이순신 |컴퓨터공학과 |C102 |A 28 | |100 |이순신 |컴퓨터공학과 |D103 |B 29 | |200 |홍길동 |컴퓨터공학과 |C102 |B 30 | |300 |윤동주 |기계공학과 |D102 |A 31 | |400 |김영랑 |수학과 |F201 |C 32 | |=== 33 | 34 | --- 35 | 36 | link:./02-2_normalization.adoc[이전: 정규화] + 37 | link:./02-4_2nf.adoc[다음: 제 2차 정규형(Second Normal Form)] -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/contents/03-1_chapter3_decomposition.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 3: 분해 2 | 3 | 정규화되지 않은 릴레이션은 중복성으로 인한 문제가 발생합니다. 3NF나 BCNF에 속하지 않은 릴레이션에서는 중복성으로 인한 삽입, 삭제, 갱신 문제가 발생할 수 있습니다. 이 단원에서는 릴레이션 스키마를 더 적은 속성을 가진 릴레이션 스키마로 분해하는 방법에 대해 배웁니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./03-2_overview_decomposition.adoc[분해 개요] 8 | 2. link:./03-3_join_decomp.adoc[무손실 조인 분해] 9 | 3. link:./03-4_dependency_decomp.adoc[종속성 유지 분해] 10 | 4. link:./03-5_BCNF.adoc[릴레이션을 3NF 또는 BCNF로 정규화] 11 | 12 | --- 13 | 14 | link:./02-6_bcnf.adoc[이전: BCNF] + 15 | link:./03-2_overview_decomposition.adoc[다음: 분해 개요] -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/contents/99_review.adoc: -------------------------------------------------------------------------------- 1 | = 검토 2 | 3 | * 스키마 정제 개요 4 | * 정규화와 정규형 5 | * 분해 6 | 7 | --- 8 | 9 | link:./03-5_BCNF.adoc[이전: BCNF로 분해] -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/homework/homework.adoc: -------------------------------------------------------------------------------- 1 | = 데이터베이스 설계 퀴즈 2 | 3 | 학사 관리 시스템을 위한 데이터베이스를 설계하려고 합니다. 4 | 요구사항 분석에서 추출된 명사들이 아래와 같을 때, 학사 관리 시스템 데이터베이스를 설계 하세요. 5 | 6 | 학생, 학번, 이름, 전공, 성별, 학생전화번호, 학생이메일, 학과, 강의실, 강의실위치, 교수, 교수 연구실, 학과식별번호, 학과사무실, 학과설립연도, 학생성별, 교수전화번호, 교수이메일, 강의, 과목, 강의식별번호, 강의계획서, 수강, 수강철회, 학점, 교수전공, 교수이름, 학생본적, 학생보호자, 학생지도교수, 학생출생연도, 학생출생지, 건물이름 7 | 8 | 설계된 데이터베이스의 모든 테이블은 3정규형을 만족해야 합니다. -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module11_schema_refine_and_normal_form/images/image01.png -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module11_schema_refine_and_normal_form/images/image02.png -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module11_schema_refine_and_normal_form/images/image03.png -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module11_schema_refine_and_normal_form/images/image04.png -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module11_schema_refine_and_normal_form/images/image05.png -------------------------------------------------------------------------------- /course/Module11_schema_refine_and_normal_form/readme.adoc: -------------------------------------------------------------------------------- 1 | link:./contents/00_schema_refine.adoc[Module 11 스키마 정제와 정규형] 2 | 3 | * link:./contents/01-1_chapter1_introduction_to_schema_refine.adoc[Chapter 1: 스키마 정제] 4 | ** link:./contents/01-2_introduction_to_schema_refine.adoc[스키마 정제 개요] 5 | ** link:./contents/01-3_decomposition.adoc[분해법] 6 | ** link:./contents/01-4_functional_dependency.adoc[함수 종속] 7 | ** link:./contents/01-5_schema_refine.adoc[스키마 정제] 8 | ** link:./contents/01-6_functional_dependency.adoc[함수 종속 이해] 9 | * link:./contents/02-1_chapter2_normalization_and_nf.adoc[Chapter 2: 정규화와 정규형] 10 | ** link:./contents/02-2_normalization.adoc[정규화(Normalization)] 11 | ** link:./contents/02-3_1nf.adoc[제 1정규형(First Normal Form)] 12 | ** link:./contents/02-4_2nf.adoc[제 2정규형(Second Normal Form)] 13 | ** link:./contents/02-5_3nf.adoc[제 3정규형(Third Normal Form)] 14 | ** link:./contents/02-6_bcnf.adoc[BCNF(Boyce-Code Normal Form)] 15 | * link:./contents/03-1_chapter3_decomposition.adoc[Chapter 3: 분해] 16 | ** link:./contents/03-2_overview_decomposition.adoc[분해 개요] 17 | ** link:./contents/03-3_join_decomp.adoc[무손실 조인 분해] 18 | ** link:./contents/03-4_dependency_decomp.adoc[종속성 유지 분해] 19 | ** link:./contents/03-5_BCNF.adoc[릴레이션을 3NF 또는 BCNF로 정규화] 20 | * link:./contents/99_review.adoc[검토] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/00_concurrency_control.adoc: -------------------------------------------------------------------------------- 1 | = Module 12: 병행성 제어 2 | 3 | 데이터베이스 관리 시스템은 조직내의 거의 모든 사용자가 동시에 사용하는 다중 사용자 시스템으로, 개별 사용자 프로그램이 동시에 조작하는 데이터에 대한 무결성을 위한 병행성을 제어할 수 있어야 합니다. 데이터베이스 관리 시스템에서는 트랜잭션을 사용하여 병행성을 제어합니다. 이 단원에서는 데이터베이스 관리 시스템의 병행 제어와 복구를 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./01-1_chapter1_transaction.adoc[트랜잭션] 8 | 2. link:./02-1_chapter2_consistency.adoc[일관성] 9 | 3. link:./03-1_chapter3_lock.adoc[잠금] 10 | 4. link:./04-1_chapter4_concurrency_control.adoc[잠금 기반 병행 제어] 11 | 5. link:./05-1_chapter5_special_lock.adoc[특수한 잠금 기법] 12 | 6. link:./06-1_chapter6_transaction_support_on_sql.adoc[SQL의 트랜잭션 지원] 13 | 14 | --- 15 | 16 | link:./01-1_chapter1_transaction.adoc[다음: Chapter 1: 트랜잭션] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/01-1_chapter1_transaction.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 1: 트랜잭션 2 | 3 | 트랜잭션(Transaction)은 데이터베이스에서 하나의 작업 단위를 의미하며, 논리적으로 묶인 일련의 연산들을 포함합니다. 트랜잭션은 데이터 무결성을 유지하고, 안전한 데이터 처리를 보장하는 중요한 개념입니다. 여기에서는 트랜잭션의 개요에 대해 알아봅니다. 4 | 5 | == Table of Contents 6 | 7 | 1. link:./01-2_introduction_to_transaction.adoc[트랜잭션 개요] 8 | 2. link:./01-3_transaction_consistency.adoc[트랜잭션과 일관성] 9 | 3. link:./01-4_transaction_and_schedule.adoc[트랜잭션과 스케줄] 10 | 11 | --- 12 | 13 | link:./00_concurrency_control.adoc[이전: Module 13: 동시성 제어] + 14 | link:./01-2_introduction_to_transaction.adoc[다음: 트랜잭션 개요] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/01-2_introduction_to_transaction.adoc: -------------------------------------------------------------------------------- 1 | = 트랜잭션 개요 2 | 3 | * 데이터베이스 객체들에 대한 일련의 판독(Read) 또는 기록(Write) 4 | ** 판독시에는 객체의 내용이 디스크에서 버퍼풀의 프레임으로 페이징되고 그 값이 프로그램 변수로 복사됨 5 | ** 기록시에는 프레임의 객체 복사본이 수정된 후 디스크에 기록 6 | * 데이터베이스 객체는 프로그램이 정보를 기록하거나 판독하는 단위 7 | ** 페이지, 레코드등의 될 수 있으며 DBMS마다 다르게 구현 8 | * ACID 9 | ** **원자성(Atomicity)** 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않음을 보장 10 | ** **일관성(Consistency)** 실행을 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지됨을 보장 11 | ** **격리성(Isolation)** 트랜잭션 수행 시 다른 트랜잭션의 연산작업이 끼어들지 못하도록 보장 12 | ** **지속성(Durability)** 성공적으로 수행된 트랜잭션은 영구적으로 데이터베이스에 반영됨을 보장 13 | 14 | --- 15 | 16 | link:./01-1_chapter1_transaction.adoc[이전: Chapter 1: 트랜잭션] + 17 | link:./01-3_transaction_consistency.adoc[다음: 트랜잭션과 일관성] 18 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/01-3_transaction_consistency.adoc: -------------------------------------------------------------------------------- 1 | = 트랜잭션과 일관성 2 | 3 | * 트랜잭션의 인터리빙과 관계없이 모든 트랜잭션은 순서대로 실행한 결과를 보장해야 함 4 | ** 두 트랜잭션 t1과 t2가 동시에 실행되더라도 실제 효과는 t1이 종료된 후 t2가 실행된 결과와 같아야 함 5 | ** 격리성(Isolation) 만족 6 | ** 무결성 제약조건을 집행할 메커니즘 제공 7 | * DBMS는 서로 다른 트랜잭션 단위 작업을 인터리빙 8 | ** DBMS는 인터리빙해서 실행한 실제 효과가 **트랜잭션들을 선형으로 실행한 것과 동등**하도록 보장함 9 | * 손상 복구 10 | ** 트랜잭션이 정상적으로 완료되지 못하는 경우 11 | *** 트랜잭션을 철회(abort)하는 경우 12 | *** 시스템 손상 13 | *** 예상치 못한 상황 14 | ** 일관성 보장을 위해 미완료 트랜잭션의 단위 작업을 무효화 함 15 | 16 | --- 17 | 18 | link:./01-2_introduction_to_transaction.adoc[이전: 트랜잭선 개요] + 19 | link:./01-4_transaction_and_schedule.adoc[다음: 트랜잭션과 스케줄] 20 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/01-4_transaction_and_schedule.adoc: -------------------------------------------------------------------------------- 1 | = 트랜잭션과 스케줄 2 | 3 | * DBMS 관점에서 트랜잭션 하나는 단위 작업(action - read와 write)들의 나열 4 | ** 트랜잭션은 부분적으로 순서화 된(partially ordered) 집합으로 정의할 수 있음 5 | ** 단위작업의 리스트로 취급할 수 있음 6 | * 트랜잭션 T에서 객체 O를 읽는 작업에서, 7 | ** 판독 단위 작업 **R~T~(O)**, 기록 단위 작업 **W~T~(O)**, 철회 작업 **A~T~**, 완결 작업 **C~T~** 8 | * 트랜잭션 스케줄 9 | ** 어떤 트랜잭션에 있는 단위작업의 리스트 10 | ** DBMS가 보는 트랜잭션의 단위 작업들을 기술 11 | ** 각 트랜잭션에 Abort와 Commit 연산을 넣은 스케줄을 완전한 스케줄(Complete Schedule)로 부름 12 | ** 다른 단위 작업이 인터리빙 되지 않는 경우 직렬 스케줄(Serial Schedule)로 부름 13 | 14 | [%header, cols="a1, a1" width="30%"] 15 | |=== 16 | |T1 | T2 17 | |R(A) + 18 | W(A) | 19 | ||R(B) + 20 | W(B) 21 | |R\(C) + 22 | W\(C)| 23 | |=== 24 | 25 | --- 26 | 27 | link:./01-3_transaction_consistency.adoc[이전: 트랜잭션과 일관성] + 28 | link:./01-lab12-1a.adoc[다음: 연습 12-1 트랜잭션 제어 (MySQL)] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/01-lab12-1b.adoc: -------------------------------------------------------------------------------- 1 | = Lab 12-1b: 트랜잭션 제어 (Microsoft SQL Server) 2 | 3 | 이 연습에서는 Microsoft SQL Server에서 제공하는 트랜잭션 문법을 사용하여 명시적/암시적 트랜잭션을 제어하는 것을 연습합니다. 아래 절차에 따릅니다. 4 | 5 | --- 6 | 7 | link:./01-lab12-1a.adoc[이전: Lab 12-1a: 트랜잭션 제어 (MySQL)] + 8 | link:./01-lab12-1c.adoc[다음: Lab 12-1c: 트랜잭션 재어 (Oracle)] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/01-lab12-1c.adoc: -------------------------------------------------------------------------------- 1 | = Lab 12-1c: 트랜잭션 제어 (Oracle) 2 | 3 | 이 연습에서는 Oracle에서 제공하는 트랜잭션 문법을 사용하여 명시적/암시적 트랜잭션을 제어하는 것을 연습합니다. 아래 절차에 따릅니다. 4 | 5 | --- 6 | 7 | link:./01-lab12-1b.adoc[이전: Lab 12-1b: 트랜잭션 제어 (Microsoft SQL Server)] + 8 | link:./01-lab12-1d.adoc[이전: Lab 12-1d: 트랜잭션 제어 (Postgres)] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/01-lab12-1d.adoc: -------------------------------------------------------------------------------- 1 | = Lab 12-1d: 트랜잭션 제어 (Postgres) 2 | 3 | 이 연습에서는 MySQL에서 제공하는 트랜잭션 문법을 사용하여 명시적/암시적 트랜잭션을 제어하는 것을 연습합니다. 아래 절차에 따릅니다. 4 | 5 | --- 6 | 7 | link:./01-lab12-1c.adoc[이전: Lab 12-1c: 트랜잭션 제어 (Oracle)] + 8 | link:./02-1_chapter2_consistency.adoc[다음: Chapter 2: 일관성] 9 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/02-1_chapter2_consistency.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 2: 일관성 2 | 3 | == Table of Contents 4 | 5 | * link:./02-2_serializable.adoc[직렬 가능성] 6 | * link:./02-3_cross_operation.adoc[교차수행에 의한 이상] 7 | * link:./02-4_wr_collision.adoc[기록-판독 충돌(WR Conflict)] 8 | * link:./02-5_serialized_transaction.adoc[순차적 트랜잭션] 9 | * link:./02-7_RW_collision.adoc[판독-기록 충돌(RW Conflict)] 10 | * link:./02-9_ww_collision.adoc[기록-기록 충돌(WW Conflict)] 11 | 12 | --- 13 | 14 | link:./01-lab12-1d.adoc[이전: Lab 12-1d 트랜잭션 제어 (Postgres)] + 15 | link:./02-2_serializable.adoc[다음: 직렬가능성] 16 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/02-2_serializable.adoc: -------------------------------------------------------------------------------- 1 | = 직렬 가능성 2 | 3 | * 직렬 가능 스케줄(Serializable Schedule) 4 | ** 일관적인 데이터베이스 인스턴스에 대한 효과가 완결된 트랜잭션 집합 S에 대대한 완전한 직렬 스케줄의 효과와 동등함이 보장되는 스케줄 5 | ** 주어진 스케줄을 수행해서 나온 데이터베이스 인스턴스는 해당 트랜잭션들을 직렬 순서대로 수행해서 나온 데이터베이스 인스턴스와 동등 6 | * 트랜잭션들을 똑같이 직렬로 수행하더라도 순서를 바꾸면 결과도 달라질 수 있음 – 이 결과는 수용 가능함 7 | * Abort된 트랜잭션이 있는 스케줄까지 포함하지는 않음 8 | 9 | --- 10 | 11 | link:./02-1_chapter2_consistency.adoc[이전: Chapter 2: 일관성] + 12 | link:./02-3_cross_operation.adoc[다음: 교차수행에 의한 일부 이상] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/02-3_cross_operation.adoc: -------------------------------------------------------------------------------- 1 | = 교차수행에 의한 일부 이상 2 | 3 | * 트랜잭션 T1과 T2의 단위 작업이 충돌(conflict)하는 경우 4 | ** 동일한 개체에 대해 두 개 이상의 단위 작업이 수행될 때 하나 이상의 트랜잭션이 기록 연산일 경우 5 | * 기록-판독 충돌(WR Conflict) 6 | * 판독-기록 충돌(RW Conflict) 7 | * 기록-기록 충돌(WW Conflict) 8 | 9 | --- 10 | 11 | link:./02-2_serializable.adoc[이전: 직렬가능성] + 12 | link:./02-4_wr_collision.adoc[다음: 기록-판독 충돌(WR 충돌)] 13 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/02-4_wr_collision.adoc: -------------------------------------------------------------------------------- 1 | = 기록-판독 충돌(WR 충돌) 2 | 3 | * 미 완결된 데이터를 읽는 경우 4 | * 기록-판독 충돌(WR 충돌) 5 | ** 트랜잭션 T1이 수정한 데이터베이스 객체 A를, T1이 Commit되기 전에 트랜잭션 T2가 판독(Read)하는 경우 6 | ** 이러한 판독을 **오손 판독(Dirty Read)**라고 부름 7 | + 8 | [%header, cols="a1, a1" width="30%"] 9 | |=== 10 | |T1 | T2 11 | |R(A) + 12 | W(A) | 13 | ||R(A) + 14 | W(A) + 15 | R(B) + 16 | R(B) + 17 | Commit 18 | |R(B) + 19 | W(B) 20 | Commit| 21 | |=== 22 | 23 | --- 24 | 25 | link:./02-3_cross_operation.adoc[이전: 교차 수행에 의한 일부 이상] + 26 | link:./02-5_serialized_transaction.adoc[다음: 순차적 트랜잭션] 27 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/02-5_serialized_transaction.adoc: -------------------------------------------------------------------------------- 1 | = 순차적 트랜잭션 2 | 3 | image:../images/image01.png[] 4 | 5 | --- 6 | 7 | link:./02-4_wr_collision.adoc[이전: 기록-판독 충돌] + 8 | link:./02-6_wr_collision.adoc[다음: 기록-판독 충돌(WR 충돌)] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/02-6_wr_collision.adoc: -------------------------------------------------------------------------------- 1 | = 기록-판독 충돌(WR 충돌) 2 | 3 | image:../images/image02.png[] 4 | 5 | --- 6 | 7 | link:./02-5_serialized_transaction.adoc[이전: 순차적 트랜잭션] + 8 | link:./02-7_RW_collision.adoc[다음: 기록-판독 충돌] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/02-7_RW_collision.adoc: -------------------------------------------------------------------------------- 1 | = 판독 - 기록 충돌(RW 충돌) 2 | 3 | * 반복 불가능한 읽기를 수행하는 경우 4 | * 판독-기록 충돌(RW 충돌) 5 | ** T1이 객체 A의 값을 판독중에 T2가 객체 A의 값을 변경하는 경우 6 | ** 이런 판독을 반복 불가능한 판독(Unrepeatable Read)라고 부름 7 | 8 | --- 9 | 10 | link:./02-6_wr_collision.adoc[이전: 기록-판독 충돌] + 11 | link:./02-8_rw_collision.adoc[다음: 판독-기록 충돌] 12 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/02-8_rw_collision.adoc: -------------------------------------------------------------------------------- 1 | = 판독 - 기록 충돌(RW 충돌) 2 | 3 | image:../images/image03.png[] 4 | 5 | --- 6 | 7 | link:./02-7_RW_collision.adoc[이전: 기록-판독 충돌] + 8 | link:./02-9_ww_collision.adoc[다음: 기록-기록 충돌] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/02-9_ww_collision.adoc: -------------------------------------------------------------------------------- 1 | = 기록-기록 충돌(WW 충돌) 2 | 3 | * 미 완결된 데이터를 덮어 쓰는 경우 4 | * 기록-기록 충돌(WW 충돌) 5 | ** T1이 어떤 객체 A의 값을 수정하고, 진행 중인 상태에서 R2가 값을 덮어 쓰는 경우 6 | ** 이런 기록을 맹목 기록(Blind Write)라고 부름 7 | 8 | --- 9 | 10 | link:./02-8_rw_collision.adoc[이전: 판독-기록 충돌] + 11 | link:./03-1_chapter3_lock.adoc[다음: Chapter 3: Lock] 12 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/03-1_chapter3_lock.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 3: Lock 2 | 3 | * link:./03-2_lock_mode.adoc[Lock Mode] 4 | * link:./03-3_shared_lock_mode.adoc[Shared Lock Mode] 5 | * link:./03-4_exclusive_lock_mode.adoc[Exclusive Lock Mode] 6 | * link:./03-5_strict_2_phase_lock.adoc[Strict 2 Phase Lock] 7 | 8 | --- 9 | 10 | link:./02-9_ww_collision.adoc[이전: 기록-기록 충돌] + 11 | link:./03-2_lock_mode.adoc[다음: Lock Mode] 12 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/03-2_lock_mode.adoc: -------------------------------------------------------------------------------- 1 | = Lock Mode 2 | 3 | * 직렬성을 보장하기 위한 방법으로, 데이터 객체들이 상호 배타적으로 액세스 되도록 함 4 | * 한 트랜잭션이 한 데이터 객체에 액세스 했을 때 다른 트랜잭션이 해당 객체를 수정하지 못하도록 함 5 | * 다중 트랜잭션 환경에서 데이터베이스의 일관성과 무결성을 유지하기 위한 순차적 진행을 보장 6 | * 잠금 모드 7 | ** Shared Lock Mode(Read Lock) 8 | *** 트랜잭션 _T~i~_ 가 데이터 객체 A에 Shared Lock을 가지고 있다면 _T~i~_ 는 A를 읽을 수 있지만 갱신할 수 없음 9 | ** Exclusive Lock Mode(Write Lock – X로 표시) 10 | *** 트랜잭션 _T~i~_ 가 데이터 객체 A에 Exclusive Lock을 가지고 있다면 _T~i~_ 는 A를 읽을 수도, 갱신할 수도 없음 11 | 12 | --- 13 | 14 | link:./03-1_chapter3_lock.adoc[이전: Chapter 3: Lock] + 15 | link:./03-3_shared_lock_mode.adoc[다음: Shared Lock Mode] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/03-3_shared_lock_mode.adoc: -------------------------------------------------------------------------------- 1 | = Shared Lock Mode 2 | 3 | * Shared Lock 또는 Read Lock - S로 표시함 4 | * 다른 트랜잭션에서 데이터를 읽을 수 있는 Lock Mode 5 | ** Shared Lock은 다른 트랜잭션에 대한 읽기 시도를 허용 6 | * 동일 데이터베이스 객체에 여러 Shared Lock이 적용될 수 있음 7 | ** 트랜잭션 T1이 객체 A에 Shared Lock을 가지고 있으면, 트랜잭션 Ti에 대해 Shared Lock을 허용 8 | ** 트랜잭션 T1이 객체 A에 Shared Lock을 가지고 있으면, 트랜잭션 Ti에 대해 Exclusive Lock을 허용하지 않음 9 | * SELECT 쿼리에 적용됨 10 | 11 | --- 12 | 13 | link:./03-2_lock_mode.adoc[이전: Lock Mode] + 14 | link:./03-4_exclusive_lock_mode.adoc[다음: Exclusive Lock Mode] 15 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/03-4_exclusive_lock_mode.adoc: -------------------------------------------------------------------------------- 1 | = Exclusive Lock Mode 2 | 3 | * Write Lock – X로 표시함 4 | * 다른 트랜잭션에서 데이터를 읽을 수도, 쓸 수도 없는 잠금 모드 5 | ** Exclusive Lock은 다른 트랜잭션의 접근을 허용하지 않음 6 | * 트랜잭션 T1이 객체 A에 Exclusive Lock을 가지고 있을 경우, Ti는 A에서 Shared Lock을 가질 수 없음 7 | * 트랜잭션 T1이 객체 A에 Exclusive Lock을 가지고 있을 경우, Ti는 A에서 Exclusive Lock을 가질 수 없음 8 | * UPDATE, DELETE, INSERT 등의 갱신 쿼리에 적용됨 9 | 10 | --- 11 | 12 | link:./03-3_shared_lock_mode.adoc[이전: Shared Lock Mode] + 13 | link:./03-5_strict_2_phase_lock.adoc[다음: Strict 2 Phase Lock] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/03-5_strict_2_phase_lock.adoc: -------------------------------------------------------------------------------- 1 | = Strict 2 Phase Lock 2 | 3 | * 가장 널리 사용되는 잠금 규약으로, 두 가지 규칙을 사용 4 | 1. 트랜잭션 T가 어떤 객체를 판독(수정)하려면, 그 객체에 대해 공유(배타적) 잠금을 요청 5 | 2. 트랜잭션이 종료될 때 가지고 있던 모든 잠금을 풀어줌 6 | * 잠금 규약은 안전한 인터리빙만을 어용함 7 | ** 두 트랜잭션이 동일한 객체에 접근하며, 한 트랜잭션이 객체를 수정하려 할 때, 단위 작업이 직렬 순서로 수행한 효과를 얻도록 함 8 | 9 | --- 10 | 11 | link:./03-4_exclusive_lock_mode.adoc[이전: Exclusive Lock Mode] + 12 | link:./04-1_chapter4_concurrency_control.adoc[다음: Chapter 4: 잠금 기반 병행 제어] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/04-1_chapter4_concurrency_control.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 4: 잠금 기반 병행 제어 2 | 3 | * link:./04-2_control_lock.adoc[잠금 관리] 4 | * link:./04-3_deadlock.adoc[교착 상태] 5 | * link:./04-4_deadlock_prevention.adoc[교착 상태 예방] 6 | * link:./04-5_deadlock_detection.adoc[교착 상태 탐지] 7 | 8 | --- 9 | 10 | link:./03-5_strict_2_phase_lock.adoc[이전: Strict2 Phase Lock] + 11 | link:./04-2_control_lock.adoc[다음: 잠금 관리] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/04-2_control_lock.adoc: -------------------------------------------------------------------------------- 1 | = 잠금 관리 2 | 3 | * DBMS는 잠금 관리자(Lock Manager)를 제공 4 | ** 잠금 관리자는 잠금 테이블(Lock Table)과 트랜잭션 테이블(Transaction Table)을 유지 5 | ** 잠금 테이블 엔트리(Lock Table Entry)로 객체에 대한 잠금 정보 관리 6 | * 잠금 요청과 잠금 해제 요청 구현 7 | ** Shared Lock을 요청하고, 요청 큐는 비어 있으며(객체에 대한 Lock을 가진 트랜잭션이 없음), 해당 객체가 현재 Exclusive로 Lock되어 있지 않은 경우에는, Lock Manager는 이 Lock을 허가하고 해당 객체에 대한 Lock Entry를 갱신 8 | ** Exclusive Lock을 요청하고, 현재 그 객체에 대한 Lock을 가진 트랜잭션이 없는 경우에는 Lock Manager는 이 Lock을 허가하고 Lock Table Entry를 갱신 9 | ** 이 밖의 경우에는 요청된 Lock이 바로 허가될 수 없으며, 해당 객체에 대한 Lock Request Queue에 요청을 추가 10 | 11 | --- 12 | 13 | link:./04-1_chapter4_concurrency_control.adoc[이전: Chapter 4: 잠금 기반 병행 제어] + 14 | link:./04-3_deadlock.adoc[다음: 교착상태(Deadlock)] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/04-3_deadlock.adoc: -------------------------------------------------------------------------------- 1 | = 교착상태(Deadlock) 2 | 3 | * 두 트랜잭션이 잠금 해제를 기다리는 관계에 사이클이 생기는 경우 4 | 5 | image:../images/image04.png[] 6 | 7 | * 논리적으로 교착상태를 막을 수 있는 방법은 없음 8 | ** 예방으로 프로세스의 시작을 막음 9 | ** 탐지로 교착상태를 검출하여 프로세스를 Kill 10 | 11 | --- 12 | 13 | link:./04-2_control_lock.adoc[이전: 잠금 관리] + 14 | link:./04-4_deadlock_prevention.adoc[다음: 교착상태 예방] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/04-4_deadlock_prevention.adoc: -------------------------------------------------------------------------------- 1 | = 교착상태 예방 2 | 3 | * 트랜잭션마다 우선순위를 부여해주고 우선 순위가 낮은 트랜잭션은 우선순위가 높은 트랜잭션을 기다릴 수 없도록 하여 예방 4 | * 우선 순위 지정에는 타임 스탬프를 사용 5 | ** 가장 오래된 트랜잭션이 가장 높은 우선순위를 가짐 6 | * 잠금 관리자는 두 가지 전략 중 하나를 사용 7 | ** 트랜잭션 _T~i~_ 가 잠금을 요청하고 트랜잭션 _T~j~_ 가 8 | ** Wait-Die + 9 | T~i~ 입장에서 자신의 우선순위가 높으면 기다리고 그렇지 않으면 철회 10 | ** Wound-Wait + 11 | T~i~ 입장에서 자신의 우선순위가 높으면 Tj를 철회, 그렇지 않으면 자신이 기다림 12 | 13 | --- 14 | 15 | link:./04-3_deadlock.adoc[이전: 교착상태] + 16 | link:./04-5_deadlock_detection.adoc[다음: 교착상태 탐지] 17 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/04-5_deadlock_detection.adoc: -------------------------------------------------------------------------------- 1 | = 교착상태 탐지 2 | 3 | * Deadlock은 매우 드물게 발생되며, 몇 안되는 트랜잭션만 관련됨 4 | * 발생 후 탐지해서 해결하는 것이 좋을 수 있음 5 | ** DBMS는 주기적으로 Deadlock인지를 점검 6 | * 잠금 관리자는 Wait-for 그래프라는 자료구조를 유지하면서 교착상태 사이클을 탐지 7 | ** T~j~ 의 잠금 해제를 T~i~ 가 기다린다면 T~i~ 에서 T~j~ 로 가는 간선이 존재함 8 | ** 잠금 관리자는 잠금 요청이 큐에 들어올때 마다 그래프에 간선을 추가, 허가 후 삭제 9 | 10 | --- 11 | 12 | link:./04-4_deadlock_prevention.adoc[이전: 교착상태 예방] + 13 | link:./04-lab12-2a.adoc[다음: Lab 12-2a 잠금 (MySQL)] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/04-lab12-2c.adoc: -------------------------------------------------------------------------------- 1 | = Lab 12-2c: 잠금 (Oracle) 2 | 3 | 이 연습에서는 같은 데이터 객체에 두 트랜잭션이 접근할 때 발생할 수 있는 여러 문제를 해결할 수 있는 잠금과, 잠금 해제를 기다리는 관계에 사이클이 생기는 경우에 발생하는 deadlock이 발생하는 상황을 시뮬레이션하고 살펴봅니다. 4 | 5 | > 참고: 이 연습에서는 이전 학습에 사용한 Module06 데이터베이스를 사용합니다. 6 | 7 | --- 8 | 9 | link:./04-lab12-2b.adoc[이전: Lab 12-2b: 잠금 (Microsoft SQL Server)] + 10 | link:./04-lab12-2d.adoc[다음: Lab 12-2d: 잠금 (Postgres)] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/04-lab12-2d.adoc: -------------------------------------------------------------------------------- 1 | = Lab 12-2d: 잠금 (Postgres) 2 | 3 | 이 연습에서는 같은 데이터 객체에 두 트랜잭션이 접근할 때 발생할 수 있는 여러 문제를 해결할 수 있는 잠금과, 잠금 해제를 기다리는 관계에 사이클이 생기는 경우에 발생하는 deadlock이 발생하는 상황을 시뮬레이션하고 살펴봅니다. 4 | 5 | > 참고: 이 연습에서는 이전 학습에 사용한 Module06 데이터베이스를 사용합니다. 6 | 7 | --- 8 | 9 | link:./12-lab12-2d.adoc[이전: Lab 12-2c: 잠금 (Oracle)] + 10 | link:./05-1_chapter5_special_lock.adoc[이전: 특수한 잠금 기법 ] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/05-1_chapter5_special_lock.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 5: 특수한 잠금 기법 2 | 3 | * link:./05-2_phantom_problem.adoc[동적 데이터베이스와 Phantom 문제] 4 | * link:./05-3_another_lock.adoc[그외 잠금 기법] 5 | 6 | --- 7 | 8 | link:./04-lab12-2d.adoc[이전: Lab 12-2d: 잠금 (Postgres)] + 9 | link:./05-2_phantom_problem.adoc[다음: 동적 데이터베이스의 팬텀 문제] 10 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/05-2_phantom_problem.adoc: -------------------------------------------------------------------------------- 1 | = 동적 데이터베이스와 팬텀 문제 2 | 3 | image:../images/image05.png[] 4 | 5 | * 트랜잭션 T1의 동작에 따라, 6 | ** 인덱스가 없어서 파일에 있는 모든 페이지를 모두 살펴보아야 한다면, T1은 기존 페이지들을 모두 잠금하고 파일에 새 페이지가 추가될 수 없도록 만들어야 함 7 | ** 인덱스가 있다면 등급이 1인 데이터 엔트리에 잠금을 할 수 있음. T2는 T1의 잠금을 해제를 기다려야 함. 이를 인덱스 잠금(Index Locking)이라고 함 8 | 9 | --- 10 | 11 | link:./05-1_chapter5_special_lock.adoc[이전: Chapter 5: 특수한 잠금 기법] + 12 | link:./05-3_another_lock.adoc[다음: 그외 잠금기법] 13 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/05-3_another_lock.adoc: -------------------------------------------------------------------------------- 1 | = 그 외 잠금기법 2 | 3 | * 트리 구조 인덱스의 경우, 인덱스 구조를 무시하고 각 페이지를 하나의 데이터 객체로 간주해서 2PL 방식을 사용 4 | * 다단위 잠금 5 | ** 의도 공용 잠금 (Intention Shared Lock: IS) 6 | *** 트랜잭션이 테이블의 개별 Row의 Shared Lock을 얻음 7 | ** 의도 전용 잠금(Intention Exclusive Lock: IX) 8 | *** 트랜잭션이 테이블의 개별 Row의 Exclusive Lock을 얻음 9 | 10 | --- 11 | 12 | link:./05-2_phantom_problem.adoc[이전: 동적 데이터베이스와 팬텀 문제] + 13 | link:./06-1_chapter6_transaction_support_on_sql.adoc[다음: SQL의 트랜잭션 지원] 14 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/06-1_chapter6_transaction_support_on_sql.adoc: -------------------------------------------------------------------------------- 1 | = Chapter 6: SQL의 트랜잭션 지원 2 | 3 | * link:./06-2_characteristic_of_transaction.adoc[트랜잭션 특성] 4 | * link:./06-3_isolation_level.adoc[Isolation Level] 5 | 6 | --- 7 | 8 | link:./05-3_another_lock.adoc[이전: 그외 잠금 기법] + 9 | link:./06-2_characteristic_of_transaction.adoc[다음: 트랜잭션 특성] 10 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/06-2_characteristic_of_transaction.adoc: -------------------------------------------------------------------------------- 1 | = 트랜잭션 특성 2 | 3 | * 트랜잭션은 세 가지 특성을 가짐 4 | ** Access Mode: UNSPECIFIED, READ ONLY, READ/WRITE 5 | ** Diagnostics-size: 기록할 수 있는 오류 조건의 수 6 | ** Isolation Level: 동시에 실행되고 있는 다른 트랜잭션의 작업들에 대해 주어진 트랜잭션이 노출되는 정도를 제어 7 | 8 | --- 9 | 10 | link:./06-1_chapter6_transaction_support_on_sql.adoc[이전: Chapter 6: SQL에서 트랜잭션 지원] + 11 | link:./06-3_isolation_level.adoc[다음: Isolation Level (1)] 12 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/06-3_isolation_level.adoc: -------------------------------------------------------------------------------- 1 | = Isolation Level (1) 2 | 3 | * SERIALIZABLE (Level 3) 4 | ** 트랜잭션 T는 완결된 트랜잭션들이 만들어 놓은 변경만 판독 5 | ** T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있음 6 | * REPEATABLE READ (Level 2) 7 | ** 트랜잭션 T는 완결된 트랜잭션들이 만들어 놓은 변경만 판독 8 | ** T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있으나, Index Locking은 하지 않음 9 | * READ COMMITTED (Level 1) 10 | ** 트랜잭션 T는 완결된 트랜잭션들이 만들어 놓은 변경만 판독 11 | ** T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있으나, T가 판독한 Row는 다른 트랜잭션이 접근가능 12 | * READ UNCOMITTED (Level 0) 13 | ** 트랜잭션 T는 진행중인 트랜잭션이 만들어 놓은 변경도 판독할 수 있음 14 | 15 | --- 16 | 17 | 트랜잭션 격리 수준(Transaction Isolation Level)은 트랜잭션들이 얼마나 고립되어 있는지를 나타내는 것으로, 특정 트랜잭션이 다른 트랜잭센에 의해 변경된 데이터를 볼 수 있도록 허용할 지 말지를 결정합니다. 18 | 19 | 트랜잭션 격리 수준은 4가지로 나눕니다. 20 | 21 | * SERIALIZABLE (Transaction Level 3) 22 | * REPEATABLE READ (Transaction Level 2) 23 | * READ UNCOMMITTE (Transaction Level 1) 24 | * READ COMMITTED (Transaction Level 0) 25 | 26 | 트랜잭션 격리 수준은 트랜잭션 수준 읽기 일관성(Transaction-Level Read Consistency)를 지키기 위해서입니다. 즉, 27 | 28 | --- 29 | 30 | link:./06-2_characteristic_of_transaction.adoc[이전: 트랜잭션 특성] + 31 | link:./06-4_isolation_level.adoc[다음: Isolation Level (2)] 32 | -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/06-4_isolation_level.adoc: -------------------------------------------------------------------------------- 1 | = Isolation Level (2) 2 | 3 | * SERIALIZABLE (Level 3) 4 | ** 다른 트랜잭션이 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제/삽입 불가능 5 | ** 모든 이상현상 방지 6 | * REPEATABLE READ (Level 2) 7 | ** 다른 트랜잭션에서 읽고 있는 데이터는 다른 트랜잭션에서 수정/삭제 불가능 8 | ** Phantom Read 발생 9 | * READ COMMITTED (Level 1) 10 | ** Commit 된 데이터만 다른 트랜잭션에서 읽을 수 있음 11 | ** Non-Repeatable Read, Phantom Read 발생 12 | * READ UNCOMITTED (Level 0) 13 | ** Commit 되지 않은 데이터를 다른 트랜잭션에서 읽을 수 있음 14 | ** Dirty Read, Non-Repeatable Read, Phantom Read 발생 15 | 16 | --- 17 | 18 | link:./06-3_isolation_level.adic[이전: Isolation Level (1)] + 19 | link:./06-5_isolation_level.adoc[다음: Isolation Level (3)] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/06-5_isolation_level.adoc: -------------------------------------------------------------------------------- 1 | = Isolation Level (3) 2 | 3 | [%header, cols=4, width=90%] 4 | |=== 5 | |Level|Dirty Read|Non-Repeatable Read|Phantom 6 | |READ UNCOMMITTED|가능성 있음|가능성있음|가능성있음 7 | |READ COMMITTED|불가|가능성 있음|가능성 있음 8 | |REPEATABLE READ|불가|불가|가능성 있음 9 | |SERIALIZABLE|불가|불가|불가 10 | |=== 11 | 12 | --- 13 | 14 | link:./06-4_isolation_level.adoc[이전: Isolation Level (2)] + 15 | link:./35_lab12-3.adoc[다음: 연습 12-3 트랜잭션 격리 수준과 잠금] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/06-lab12-3b.adoc: -------------------------------------------------------------------------------- 1 | = Lab 12-3a: 트랜잭션 격리 수준과 잠금 (Microsoft SQL Server) 2 | 3 | 이 연습에서는 트랜잭션 격리 수준에 따른 잠금을 Microsoft SQL Server에서 제공하는 문법을 사용하여 테스트합니다. 아래 절차에 따릅니다. 4 | 5 | --- 6 | 7 | link:./06-lab12-3a.adoc[이전: Lab 12-3a: 트랜잭션 격리 수준과 잠금 (MySQL)] + 8 | link:./06-lab12-3c.adoc[다음: Lab 12-3c: 트랜잭션 격리 수준과 잠금 (Oracle)] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/06-lab12-3c.adoc: -------------------------------------------------------------------------------- 1 | = Lab 12-3c: 트랜잭션 격리 수준과 잠금 (Oracle) 2 | 3 | 이 연습에서는 트랜잭션 격리 수준에 따른 잠금을 Oracle에서 제공하는 문법을 사용하여 테스트합니다. 아래 절차에 따릅니다. 4 | 5 | --- 6 | 7 | link:./06-lab12-3b.adoc[이전: Lab 12-3b: 트랜잭션 격리 수준과 잠금 (Microsoft SQL Server)] + 8 | link:./06-lab12-3d.adoc[다음: Lab 12-3d: 트랜잭션 격리 수준과 잠금 (Postgres)] -------------------------------------------------------------------------------- /course/Module13_concurrency_control/contents/06-lab12-3d.adoc: -------------------------------------------------------------------------------- 1 | = Lab 12-3d: 트랜잭션 격리 수준과 잠금 (Postgres) 2 | 3 | 이 연습에서는 트랜잭션 격리 수준에 따른 잠금을 Postgres에서 제공하는 문법을 사용하여 테스트합니다. 아래 절차에 따릅니다. 4 | 5 | --- -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image01.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image02.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image03.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image04.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image05.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image06.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image07.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image08.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image09.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image10.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image11.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image12.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image13.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image14.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image15.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image16.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image17.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image18.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image19.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image20.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image21.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image22.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image23.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image24.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image25.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image26.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image27.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image28.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image29.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image30.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image31.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image32.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image33.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image34.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image35.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image36.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image37.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image38.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image39.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image40.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image41.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image42.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image43.png -------------------------------------------------------------------------------- /course/Module13_concurrency_control/images/image44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/Module13_concurrency_control/images/image44.png -------------------------------------------------------------------------------- /course/test/image/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/test/image/1.png -------------------------------------------------------------------------------- /course/test/image/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/test/image/10.png -------------------------------------------------------------------------------- /course/test/image/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/test/image/11.png -------------------------------------------------------------------------------- /course/test/image/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/test/image/13.png -------------------------------------------------------------------------------- /course/test/image/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/test/image/33.png -------------------------------------------------------------------------------- /course/test/image/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/test/image/35.png -------------------------------------------------------------------------------- /course/test/image/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/test/image/40.png -------------------------------------------------------------------------------- /course/test/image/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gikpreet/class-relational_database/e39fb645d509ca73dc6e4bb591d00a41831dd581/course/test/image/7.png -------------------------------------------------------------------------------- /readme.adoc: -------------------------------------------------------------------------------- 1 | = Relational Database 2 | 3 | 1. link:./course/Module01_overview_database/contents/00_introduction.adoc[Module 01: 데이터베이스 개요] 4 | 2. link:./course/Module02_relational_model/contents/00_introduction.adoc[Module 02: 관계 모델] 5 | 3. link:./course/Module03_disk_and_file/contents/00_introduction.adoc[Module 03: 디스크와 파일] 6 | 4. link:./course/Module04_file_and_index/contents/00_file_and_index.adoc[Module 04: 파일조직과 인덱스] 7 | 5. link:./course/Module05_algebra_calcurus/contents/00_algebra_calcurus.adoc[Module 05: 관계대수와 관계해석] 8 | 6. link:./course/Module06_sql/contents/00_introduction.adoc[Module 06: SQL] 9 | 7. link:./course/Module07_security_view/contents/00_security_view.adoc[Module 07: 보안과 뷰] 10 | 8. link:./course/Module08_sp_function_trigger/contents/00_introduction.adoc[Module 08: 저장 프로시저와 함수, 트리거] 11 | 9. link:./course/Module09_persistant_stored_module/contents/01_introduction.adoc[Module 09: Persistant Stored Module] 12 | 10. link:./course/Module10_er_model/contents/00_introduction.adoc[Module 10: ER 모델] 13 | 11. link:./course/Module11_schema_refine_and_normal_form/contents/01_schema_refine.adoc[Module 11: 스키마 정제와 정규형] 14 | 12. link:./course/Module13_concurrency_control/contents/00_concurrency_control.adoc[Module 13: 병행성 제어] 15 | 16 | Appendex link:./course/n1_appendix_setup_dbms/readme.adoc[실습을 위한 DBMS 설치] --------------------------------------------------------------------------------