{
"cells": [
{
"cell_type": "markdown",
"id": "61f5c915",
"metadata": {},
"source": [
"# Normalization\n",
"\n",
"What is database normalization?\n",
"- Ref: https://www.complexsql.com/database-normalization/\n",
"- Ref: http://www.databasedev.co.uk/1norm_form.html\n",
"- The purpose of database normalization is to:\n",
"- eliminate redundant data\n",
"- reduce complexity of data, making it easier to manage the data and make change\n",
"- ensure logical data dependencies\n",
"- How is database normalization achieved?\n",
" - By fulfilling five normal forms. Each normal form represents an increasingly stringent set of rules. Usually fulfilling the first three normal forms is sufficient.\n",
" - Ref: https://www.1keydata.com/database-normalization/first-normal-form-1nf.php\n",
"- First Normal Form (1NF): \n",
" 1. if there are no repeating groups.\n",
" 2. all values are atomic, meaning they are the smallest meaningful value\n",
"- Second Normal Form (2NF): \n",
" 1. the table is in first normal form\n",
" 2. each non-key field is functionally dependent on the entire primary key\n",
"- Third Normal Form (3NF):\n",
" 1. the table is in second normal form\n",
" 2. there are no transitive dependencies\n",
"- Ref: https://arctype.com/blog/2nf-3nf-normalization-example/\n",
"- Summary\n",
" 1. All values must be atomic\n",
" 2. No redundancy\n",
" 3. No implicit relationship/dependency\n",
" 4. No transitive relationship/dependency\n",
"\n",
"## Bad Design Examples\n",
"### Example 1"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "ddb8d268",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" EmployeeID | \n",
" Name | \n",
" Project | \n",
" Time | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" EN1-26 | \n",
" Sean O'Brien | \n",
" 30-452-T3, 30-457-T3, 32-244-T3 | \n",
" 0.25, 0.40, 0.30 | \n",
"
\n",
" \n",
" 1 | \n",
" EN1-33 | \n",
" Amy Guya | \n",
" 30-452-T3, 30-382-TC, 32-244-T3 | \n",
" 0.05, 0.35, 0.60 | \n",
"
\n",
" \n",
" 2 | \n",
" EN1-35 | \n",
" Steven Baranco | \n",
" 30-452-T3, 31-238-TC | \n",
" 0.15, 0.80 | \n",
"
\n",
" \n",
" 3 | \n",
" EN1-36 | \n",
" Elizabeth Roslyn | \n",
" 35-152-TC | \n",
" 0.90 | \n",
"
\n",
" \n",
" 4 | \n",
" EN1-38 | \n",
" Carol Schaaf | \n",
" 36-272-TC | \n",
" 0.75 | \n",
"
\n",
" \n",
" 5 | \n",
" EN1-40 | \n",
" Alexandra Wing | \n",
" 31-238-TC, 31-241-TC | \n",
" 0.20, 0.70 | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('example1.db')\n",
"\n",
"sql_statement = \"SELECT * FROM EMPLOYEES_PROJECTS_TIME\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
},
{
"cell_type": "markdown",
"id": "155d11ea",
"metadata": {},
"source": [
"- Problems with example1\n",
" - Repeating group of fields\n",
" - The project and time fields are not made up of atomic values\n",
" - Can't sort by last name\n",
" - Can't sort by time because field is type text\n",
" - Assumed relationship between project and time\n",
"\n",
"### Example 2"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "63b03eca",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" EmployeeID | \n",
" Last_Name | \n",
" First_Name | \n",
" Project1 | \n",
" Time1 | \n",
" Project2 | \n",
" Time2 | \n",
" Project3 | \n",
" Time3 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" EN1-26 | \n",
" O'Brien | \n",
" Sean | \n",
" 30-452-T3 | \n",
" 0.250000 | \n",
" 30-457-T3 | \n",
" 0.400000 | \n",
" 32-244-T3 | \n",
" 0.300000 | \n",
"
\n",
" \n",
" 1 | \n",
" EN1-33 | \n",
" Guya | \n",
" Amy | \n",
" 30-452-T3 | \n",
" 0.050000 | \n",
" 30-382-TC | \n",
" 0.350000 | \n",
" 32-244-T3 | \n",
" 0.600000 | \n",
"
\n",
" \n",
" 2 | \n",
" EN1-35 | \n",
" Baranco | \n",
" Steven | \n",
" 30-452-T3 | \n",
" 0.150000 | \n",
" 31-238-TC | \n",
" 0.800000 | \n",
" None | \n",
" nan | \n",
"
\n",
" \n",
" 3 | \n",
" EN1-36 | \n",
" Roslyn | \n",
" Elizabeth | \n",
" 35-152-TC | \n",
" 0.900000 | \n",
" None | \n",
" nan | \n",
" None | \n",
" nan | \n",
"
\n",
" \n",
" 4 | \n",
" EN1-38 | \n",
" Schaaf | \n",
" Carol | \n",
" 36-272-TC | \n",
" 0.750000 | \n",
" None | \n",
" nan | \n",
" None | \n",
" nan | \n",
"
\n",
" \n",
" 5 | \n",
" EN1-40 | \n",
" Wing | \n",
" Alexandra | \n",
" 31-238-TC | \n",
" 0.200000 | \n",
" 31-241-TC | \n",
" 0.700000 | \n",
" None | \n",
" nan | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('example2.db')\n",
"\n",
"sql_statement = \"SELECT * FROM EMPLOYEES_PROJECTS_TIME\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
},
{
"cell_type": "markdown",
"id": "340746c6",
"metadata": {},
"source": [
"- Analysis of example2\n",
" - Can sort now!\n",
" - How can you add another project?\n",
"\n",
"### Example 3"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "c88ceb44",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" EmployeeID | \n",
" Last_Name | \n",
" First_Name | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" EN1-26 | \n",
" O'Brien | \n",
" Sean | \n",
"
\n",
" \n",
" 1 | \n",
" EN1-33 | \n",
" Guya | \n",
" Amy | \n",
"
\n",
" \n",
" 2 | \n",
" EN1-35 | \n",
" Baranco | \n",
" Steven | \n",
"
\n",
" \n",
" 3 | \n",
" EN1-36 | \n",
" Roslyn | \n",
" Elizabeth | \n",
"
\n",
" \n",
" 4 | \n",
" EN1-38 | \n",
" Schaaf | \n",
" Carol | \n",
"
\n",
" \n",
" 5 | \n",
" EN1-40 | \n",
" Wing | \n",
" Alexandra | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" EmployeeID Last_Name First_Name\n",
"0 EN1-26 O'Brien Sean\n",
"1 EN1-33 Guya Amy\n",
"2 EN1-35 Baranco Steven\n",
"3 EN1-36 Roslyn Elizabeth\n",
"4 EN1-38 Schaaf Carol\n",
"5 EN1-40 Wing Alexandra"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" ProjectNum | \n",
" EmployeeID | \n",
" Time | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 30-328-TC | \n",
" EN1-33 | \n",
" 0.350000 | \n",
"
\n",
" \n",
" 1 | \n",
" 30-452-T3 | \n",
" EN1-26 | \n",
" 0.250000 | \n",
"
\n",
" \n",
" 2 | \n",
" 30-452-T3 | \n",
" EN1-33 | \n",
" 0.050000 | \n",
"
\n",
" \n",
" 3 | \n",
" 30-452-T3 | \n",
" EN1-35 | \n",
" 0.150000 | \n",
"
\n",
" \n",
" 4 | \n",
" 31-238-TC | \n",
" EN1-35 | \n",
" 0.800000 | \n",
"
\n",
" \n",
" 5 | \n",
" 30-457-T3 | \n",
" EN1-26 | \n",
" 0.400000 | \n",
"
\n",
" \n",
" 6 | \n",
" 31-238-TC | \n",
" EN1-40 | \n",
" 0.200000 | \n",
"
\n",
" \n",
" 7 | \n",
" 31-241-TC | \n",
" EN1-40 | \n",
" 0.700000 | \n",
"
\n",
" \n",
" 8 | \n",
" 32-244-T3 | \n",
" EN1-33 | \n",
" 0.600000 | \n",
"
\n",
" \n",
" 9 | \n",
" 35-152-TC | \n",
" EN1-36 | \n",
" 0.900000 | \n",
"
\n",
" \n",
" 10 | \n",
" 36-272-TC | \n",
" EN1-38 | \n",
" 0.750000 | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('example3.db')\n",
"\n",
"sql_statement = \"SELECT * FROM EMPLOYEES\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')\n",
"display(df)\n",
"\n",
"sql_statement = \"SELECT * FROM PROJECTS_EMPLOYEES_TIME\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
},
{
"cell_type": "markdown",
"id": "a6555301",
"metadata": {},
"source": [
"- Analysis of example3 -- first normal form\n",
" - Can do groups by employeeid or projectnum\n",
" - Can sort by time\n",
" - Can sort by name\n",
"\n",
"\n",
"### Example 4"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "9c889eae",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" EmployeeID | \n",
" Last_Name | \n",
" First_Name | \n",
" ProjectNumber | \n",
" ProjectTitle | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" EN1-26 | \n",
" O'Brien | \n",
" Sean | \n",
" 30-452-T3 | \n",
" STAR manual | \n",
"
\n",
" \n",
" 1 | \n",
" EN1-26 | \n",
" O'Brien | \n",
" Sean | \n",
" 30-457-T3 | \n",
" ISO procedures | \n",
"
\n",
" \n",
" 2 | \n",
" EN1-26 | \n",
" O'Brien | \n",
" Sean | \n",
" 31-124-T3 | \n",
" Employee handbook | \n",
"
\n",
" \n",
" 3 | \n",
" EN1-33 | \n",
" Guya | \n",
" Amy | \n",
" 30-452-T3 | \n",
" STAR manual | \n",
"
\n",
" \n",
" 4 | \n",
" EN1-33 | \n",
" Guya | \n",
" Amy | \n",
" 30-482-TC | \n",
" Web Site | \n",
"
\n",
" \n",
" 5 | \n",
" EN1-33 | \n",
" Guya | \n",
" Amy | \n",
" 31-241-TC | \n",
" New catalog | \n",
"
\n",
" \n",
" 6 | \n",
" EN1-35 | \n",
" Baranco | \n",
" Steven | \n",
" 30-452-T3 | \n",
" STAR manual | \n",
"
\n",
" \n",
" 7 | \n",
" EN1-35 | \n",
" Baranco | \n",
" Steven | \n",
" 31-238-TC | \n",
" STAR prototype | \n",
"
\n",
" \n",
" 8 | \n",
" EN1-36 | \n",
" Roslyn | \n",
" Elizabeth | \n",
" 35-152-TC | \n",
" STAR pricing | \n",
"
\n",
" \n",
" 9 | \n",
" EN1-38 | \n",
" Schaaf | \n",
" Carol | \n",
" 36-272-TC | \n",
" Order system | \n",
"
\n",
" \n",
" 10 | \n",
" EN1-40 | \n",
" Wing | \n",
" Alexandra | \n",
" 31-238-TC | \n",
" STAR prototype | \n",
"
\n",
" \n",
" 11 | \n",
" EN1-40 | \n",
" Wing | \n",
" Alexandra | \n",
" 31-241-TC | \n",
" New catalog | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('example4.db')\n",
"\n",
"sql_statement = \"SELECT * FROM EMPLOYEES_PROJECTS\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
},
{
"cell_type": "markdown",
"id": "0db83086",
"metadata": {},
"source": [
"- Analysis of example4\n",
" - How would you update the project title for a given project? Have to edit in many places\n",
" - Can you add a project without an employeeid?\n",
" - How can you delete a project?\n",
"\n",
"### Example 5"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "8413f020",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" EmployeeID | \n",
" Last_Name | \n",
" First_Name | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" EN1-26 | \n",
" O'Brien | \n",
" Sean | \n",
"
\n",
" \n",
" 1 | \n",
" EN1-33 | \n",
" Guya | \n",
" Amy | \n",
"
\n",
" \n",
" 2 | \n",
" EN1-35 | \n",
" Baranco | \n",
" Steven | \n",
"
\n",
" \n",
" 3 | \n",
" EN1-36 | \n",
" Roslyn | \n",
" Elizabeth | \n",
"
\n",
" \n",
" 4 | \n",
" EN1-38 | \n",
" Schaaf | \n",
" Carol | \n",
"
\n",
" \n",
" 5 | \n",
" EN1-40 | \n",
" Wing | \n",
" Alexandra | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" EmployeeID Last_Name First_Name\n",
"0 EN1-26 O'Brien Sean\n",
"1 EN1-33 Guya Amy\n",
"2 EN1-35 Baranco Steven\n",
"3 EN1-36 Roslyn Elizabeth\n",
"4 EN1-38 Schaaf Carol\n",
"5 EN1-40 Wing Alexandra"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" EmployeeID | \n",
" ProjectNum | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" EN1-26 | \n",
" 30-452-T3 | \n",
"
\n",
" \n",
" 1 | \n",
" EN1-26 | \n",
" 30-457-T3 | \n",
"
\n",
" \n",
" 2 | \n",
" EN1-26 | \n",
" 31-124-T3 | \n",
"
\n",
" \n",
" 3 | \n",
" EN1-33 | \n",
" 30-328-TC | \n",
"
\n",
" \n",
" 4 | \n",
" EN1-33 | \n",
" 30-452-T3 | \n",
"
\n",
" \n",
" 5 | \n",
" EN1-33 | \n",
" 32-244-T3 | \n",
"
\n",
" \n",
" 6 | \n",
" EN1-35 | \n",
" 30-452-T3 | \n",
"
\n",
" \n",
" 7 | \n",
" EN1-35 | \n",
" 31-238-TC | \n",
"
\n",
" \n",
" 8 | \n",
" EN1-36 | \n",
" 35-152-TC | \n",
"
\n",
" \n",
" 9 | \n",
" EN1-38 | \n",
" 36-272-TC | \n",
"
\n",
" \n",
" 10 | \n",
" EN1-40 | \n",
" 31-238-TC2 | \n",
"
\n",
" \n",
" 11 | \n",
" EN1-40 | \n",
" 31-241-TC | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" EmployeeID ProjectNum\n",
"0 EN1-26 30-452-T3\n",
"1 EN1-26 30-457-T3\n",
"2 EN1-26 31-124-T3\n",
"3 EN1-33 30-328-TC\n",
"4 EN1-33 30-452-T3\n",
"5 EN1-33 32-244-T3\n",
"6 EN1-35 30-452-T3\n",
"7 EN1-35 31-238-TC\n",
"8 EN1-36 35-152-TC\n",
"9 EN1-38 36-272-TC\n",
"10 EN1-40 31-238-TC2\n",
"11 EN1-40 31-241-TC"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" ProjectNum | \n",
" ProjectTitle | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 30-452-T3 | \n",
" STAR manual | \n",
"
\n",
" \n",
" 1 | \n",
" 30-457-T3 | \n",
" ISO procedures | \n",
"
\n",
" \n",
" 2 | \n",
" 30-482-TC | \n",
" Web site | \n",
"
\n",
" \n",
" 3 | \n",
" 31-124-T3 | \n",
" Employee handbook | \n",
"
\n",
" \n",
" 4 | \n",
" 31-238-TC | \n",
" STAR prototype | \n",
"
\n",
" \n",
" 5 | \n",
" 31-238-TC2 | \n",
" New catalog | \n",
"
\n",
" \n",
" 6 | \n",
" 35-152-TC | \n",
" STAR pricing | \n",
"
\n",
" \n",
" 7 | \n",
" 36-272-TC | \n",
" Order system | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('example5.db')\n",
"\n",
"sql_statement = \"SELECT * FROM EMPLOYEES\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')\n",
"display(df)\n",
"\n",
"sql_statement = \"SELECT * FROM EMPLOYEES_PROJECTS\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')\n",
"display(df)\n",
"\n",
"sql_statement = \"SELECT * FROM PROJECTS\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
},
{
"cell_type": "markdown",
"id": "61b0ee55",
"metadata": {},
"source": [
"- Analysis of example5\n",
" - second normal form\n",
"\n",
"### Example 6"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "7b756662",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" ProjectNum | \n",
" ProjectTitle | \n",
" ProjectMgr | \n",
" Phone | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 30-452-T3 | \n",
" STAR manual | \n",
" Garrison | \n",
" 2756 | \n",
"
\n",
" \n",
" 1 | \n",
" 30-457-T3 | \n",
" ISO procedures | \n",
" Jacanda | \n",
" 2954 | \n",
"
\n",
" \n",
" 2 | \n",
" 30-482-TC | \n",
" Web site | \n",
" Friedman | \n",
" 2846 | \n",
"
\n",
" \n",
" 3 | \n",
" 31-124-T3 | \n",
" Employee handbook | \n",
" Jones | \n",
" 3102 | \n",
"
\n",
" \n",
" 4 | \n",
" 31-238-TC | \n",
" STAR prototype | \n",
" Garrison | \n",
" 2756 | \n",
"
\n",
" \n",
" 5 | \n",
" 31-241-TC | \n",
" New catalog | \n",
" Jones | \n",
" 3102 | \n",
"
\n",
" \n",
" 6 | \n",
" 35-152-TC | \n",
" STAR pricing | \n",
" Vance | \n",
" 3022 | \n",
"
\n",
" \n",
" 7 | \n",
" 36-272-TC | \n",
" Order system | \n",
" Jacanda | \n",
" 2954 | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('example6.db')\n",
"sql_statement = \"SELECT * FROM PROJECTS\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
},
{
"cell_type": "markdown",
"id": "86d692d4",
"metadata": {},
"source": [
"- Analysis of example 6\n",
" - Phone number, which is a non-key field, has transitive dependency on another non-key field. \n",
"\n",
"### Example 6"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "e6222202",
"metadata": {
"tags": [
"hide-input",
"output_scroll"
]
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" ProjectMgr | \n",
" Phone | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Friedman | \n",
" 2846 | \n",
"
\n",
" \n",
" 1 | \n",
" Garrison | \n",
" 2756 | \n",
"
\n",
" \n",
" 2 | \n",
" Jacanda | \n",
" 2954 | \n",
"
\n",
" \n",
" 3 | \n",
" Jones | \n",
" 3102 | \n",
"
\n",
" \n",
" 4 | \n",
" Vance | \n",
" 3022 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" ProjectMgr Phone\n",
"0 Friedman 2846\n",
"1 Garrison 2756\n",
"2 Jacanda 2954\n",
"3 Jones 3102\n",
"4 Vance 3022"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n",
" \n",
" \n",
" | \n",
" ProjectNum | \n",
" ProjectTitle | \n",
" ProjectMgr | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 30-452-T3 | \n",
" STAR manual | \n",
" Garrison | \n",
"
\n",
" \n",
" 1 | \n",
" 30-457-T3 | \n",
" ISO procedures | \n",
" Jacanda | \n",
"
\n",
" \n",
" 2 | \n",
" 30-482-TC | \n",
" Web site | \n",
" Friedman | \n",
"
\n",
" \n",
" 3 | \n",
" 31-124-T3 | \n",
" Employee handbook | \n",
" Jones | \n",
"
\n",
" \n",
" 4 | \n",
" 31-238-TC | \n",
" STAR prototype | \n",
" Garrison | \n",
"
\n",
" \n",
" 5 | \n",
" 31-241-TC | \n",
" New catalog | \n",
" Jones | \n",
"
\n",
" \n",
" 6 | \n",
" 35-152-TC | \n",
" STAR pricing | \n",
" Vance | \n",
"
\n",
" \n",
" 7 | \n",
" 36-272-TC | \n",
" Order system | \n",
" Jacanda | \n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import sqlite3\n",
"import pandas as pd\n",
"\n",
"conn = sqlite3.connect('example7.db')\n",
"sql_statement = \"SELECT * FROM MANAGERS\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')\n",
"display(df)\n",
"\n",
"conn = sqlite3.connect('example7.db')\n",
"sql_statement = \"SELECT * FROM PROJECTS\"\n",
"df = pd.read_sql_query(sql_statement, conn)\n",
"df.style.set_table_attributes('style=\"font-size: 12px\"')"
]
},
{
"cell_type": "markdown",
"id": "e5c659a0",
"metadata": {},
"source": [
"- Analysis of example7\n",
" - Removed transitive dependency"
]
}
],
"metadata": {
"jupytext": {
"formats": "md:myst",
"text_representation": {
"extension": ".md",
"format_name": "myst"
}
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
},
"source_map": [
11,
43,
53,
64,
74,
82,
97,
107,
117,
126,
146,
153,
162,
169,
185
]
},
"nbformat": 4,
"nbformat_minor": 5
}