# Database Optimization

## Normalization

* Divides larger tables into small sets to minimize data redundancy
* Prevent the problems caused by typical CRUD actions

Example:

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2FQ8n6o1NeYbnfbP3E4R7R%2Fimage.png?alt=media&#x26;token=c0fdabfc-3ace-4bd5-a17c-2cb473dd4a94" alt=""><figcaption></figcaption></figure>

### Types of Anomalies

#### Insert Anomaly

If a student is not assigned to a course, and the course\_ID isn't nullable, then your insert is not possible.

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2FBtiriMOKbU0Gjl8mDfpn%2Fimage.png?alt=media&#x26;token=6e55ef06-2d29-4ed3-9699-205bd46bb59f" alt=""><figcaption></figcaption></figure>

#### Delete Anomaly

By deleting a student you would also delete all the college related information.

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2FR5uGIEAxqmAFcEXDrDgO%2Fimage.png?alt=media&#x26;token=7757ef1f-11c4-4ddd-b5d3-2a695da44bc6" alt=""><figcaption></figcaption></figure>

#### Update Anomaly <a href="#update-anomaly" id="update-anomaly"></a>

If you miss any record on the course attributes while updating, then you will have data inconsistency.

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2FXQIzXVXkMZPxggM6kJqo%2Fimage.png?alt=media&#x26;token=5112e28b-eba8-467c-a277-00cd1c54347d" alt=""><figcaption></figcaption></figure>

### Normal forms

To prevent these types of anomalies, we can use Normal Form transformation.

#### First Normal Form (1NF)

Column cell of a table cannot hold multiple values

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2F0ddrU59WTqvueYIGKbui%2Fimage.png?alt=media&#x26;token=c2423382-4de7-4210-b75e-981820ae20f6" alt=""><figcaption></figcaption></figure>

By applying the 1NF:

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2FA36inDZjvO90ox0qH7Be%2Fimage.png?alt=media&#x26;token=6d1f8a57-10db-4f91-bda2-7de481bd8813" alt=""><figcaption></figcaption></figure>

#### Second Normal Form (2NF)

* Must be in 1NF
* Data Redundancy across multiple rows
* Data must be moved to separate table

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2FOlplSCvogSNkycWg9kU4%2Fimage.png?alt=media&#x26;token=278f60b2-abc9-4375-809b-a64757ff69f5" alt=""><figcaption></figcaption></figure>

By applying the 2NF:

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2FBIsa42gPm9IwWJrlkTJq%2Fimage.png?alt=media&#x26;token=62c2c85d-7926-4584-a83f-5d5cd61dabfa" alt=""><figcaption></figcaption></figure>

#### Third Normal Form (3NF)

* Must be in 2NF
* Eliminate fields that do not depend on the primary key

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2FfdmzmJCdrALVDknRyzu3%2Fimage.png?alt=media&#x26;token=c9f6ded4-44fc-431e-bfef-61d7df0b95be" alt=""><figcaption></figcaption></figure>

By applying the 3NF:

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2FiHZz8fMxrujqBsZbeh3u%2Fimage.png?alt=media&#x26;token=e182eef4-626a-4596-9a6c-303349ff7c9d" alt=""><figcaption></figcaption></figure>

## Denormalization <a href="#denormalization" id="denormalization"></a>

* Data from multiple tables are combined into one table
* Faster data retrieval
* Avoid costly join in a relational database
* Increased performance
* Applied after normalization

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2FKeS6TclDEmwFPfUDif58%2Fimage.png?alt=media&#x26;token=a0fff2b5-25e5-4c77-94ab-361ba3fb8185" alt=""><figcaption></figcaption></figure>

## OLTP and OLAP implementations <a href="#oltp-and-olap-implementations" id="oltp-and-olap-implementations"></a>

<figure><img src="https://3167488510-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN5Oxfr1ogoEGQMX2dzNM%2Fuploads%2FnSKeLlzIcqnZK6rIc2L7%2Fimage.png?alt=media&#x26;token=14291d60-5e0d-47ad-8a24-071b137c4fb9" alt=""><figcaption></figcaption></figure>

### Normalization on OLTP <a href="#normalization-on-oltp" id="normalization-on-oltp"></a>

* Write operation: Single update on target table
* Read operation: Costly join operations

### Denormalization on OLAP <a href="#denormalization-on-olap" id="denormalization-on-olap"></a>

* Write operation: Multiple updates on target attributes, can lead to data inconsistency
* Read Operation: Minimal join operations
