{"id":25931040,"url":"https://github.com/rikulauttia/database-fundamentals","last_synced_at":"2026-04-10T02:12:08.132Z","repository":{"id":279807182,"uuid":"940052850","full_name":"rikulauttia/database-fundamentals","owner":"rikulauttia","description":"Database performance engineering lab demonstrating 148x query optimization through advanced indexing strategies and ACID-compliant transaction patterns. Features production-ready implementations spanning both SQL and NoSQL paradigms with measured performance analytics. A practical showcase of database engineering principles.","archived":false,"fork":false,"pushed_at":"2025-02-27T14:43:12.000Z","size":8,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-27T20:25:50.842Z","etag":null,"topics":["acid","concurrency","database","database-design","database-optimization","indexing","mongodb","normalization","nosql","performance-testing","python-database","query-performance","relational-algebra","sql","sqlite","transactions"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rikulauttia.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-27T14:38:49.000Z","updated_at":"2025-02-27T14:46:40.000Z","dependencies_parsed_at":"2025-02-27T20:27:40.669Z","dependency_job_id":"d9b8d63b-b884-4464-82b9-11597889d2b6","html_url":"https://github.com/rikulauttia/database-fundamentals","commit_stats":null,"previous_names":["rikulauttia/database-fundamentals"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rikulauttia%2Fdatabase-fundamentals","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rikulauttia%2Fdatabase-fundamentals/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rikulauttia%2Fdatabase-fundamentals/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rikulauttia%2Fdatabase-fundamentals/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rikulauttia","download_url":"https://codeload.github.com/rikulauttia/database-fundamentals/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241758972,"owners_count":20015247,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["acid","concurrency","database","database-design","database-optimization","indexing","mongodb","normalization","nosql","performance-testing","python-database","query-performance","relational-algebra","sql","sqlite","transactions"],"created_at":"2025-03-03T23:57:10.284Z","updated_at":"2025-12-31T01:03:04.646Z","avatar_url":"https://github.com/rikulauttia.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🛢️ Database Fundamentals\n\n\u003cdiv align=\"center\"\u003e\n  \n![Database Banner](https://img.shields.io/badge/Database-Fundamentals-blue?style=for-the-badge\u0026logo=postgresql)\n\n[![SQL](https://img.shields.io/badge/SQL-Advanced-orange?style=flat-square\u0026logo=postgresql)](https://github.com/rikulauttia/database-fundamentals)\n[![NoSQL](https://img.shields.io/badge/NoSQL-MongoDB-green?style=flat-square\u0026logo=mongodb)](https://github.com/rikulauttia/database-fundamentals)\n[![Python](https://img.shields.io/badge/Python-SQLite-blue?style=flat-square\u0026logo=python)](https://github.com/rikulauttia/database-fundamentals)\n[![Transactions](https://img.shields.io/badge/ACID-Transactions-red?style=flat-square)](https://github.com/rikulauttia/database-fundamentals)\n[![Indexing](https://img.shields.io/badge/Performance-Indexing-yellow?style=flat-square)](https://github.com/rikulauttia/database-fundamentals)\n\n\u003c/div\u003e\n\n## 📋 Overview\n\nThis repository contains practical exercises and implementations from a database fundamentals course. It explores both theoretical concepts and hands-on applications of database systems, from SQL queries to NoSQL databases, indexing performance, and transaction management.\n\n## 🧩 Exercise Collection\n\n### 1️⃣ Database Programming with SQLite\n\nImplementations of Python functions to query and analyze city bike trip data stored in SQLite. Features include:\n\n- User distance and speed calculations\n- City-based trip duration analysis\n- User tracking across multiple cities\n- Daily trip statistics\n- Popular starting points identification\n\n\u003cdetails\u003e\n\u003csummary\u003eView Implementation Details\u003c/summary\u003e\n\n```python\n# Sample function: Finding the total distance traveled by a user\ndef distance_of_user(user):\n    conn = get_db_connection()\n    cursor = conn.cursor()\n\n    query = \"\"\"\n    SELECT SUM(distance)\n    FROM Trips\n    JOIN Users ON Trips.user_id = Users.id\n    WHERE Users.name = ?\n    \"\"\"\n\n    cursor.execute(query, (user,))\n    result = cursor.fetchone()[0]\n    conn.close()\n    return result\n```\n\n\u003c/details\u003e\n\n### 2️⃣ Database Design \u0026 Schema Creation\n\nDesign and implementation of a university course management system with:\n\n- Tables for teachers, courses, students, credits, and groups\n- Advanced query capabilities for course-student-teacher relationships\n- Grade distribution analysis\n- Cross-relational statistics gathering\n\n\u003cdetails\u003e\n\u003csummary\u003eView Database Schema\u003c/summary\u003e\n\n```sql\nCREATE TABLE teachers (\n    id INTEGER PRIMARY KEY,\n    name TEXT\n);\n\nCREATE TABLE courses (\n    id INTEGER PRIMARY KEY,\n    name TEXT,\n    credits INTEGER\n);\n\nCREATE TABLE course_teachers (\n    id INTEGER PRIMARY KEY,\n    course_id INTEGER,\n    teacher_id INTEGER,\n    FOREIGN KEY (course_id) REFERENCES courses(id),\n    FOREIGN KEY (teacher_id) REFERENCES teachers(id)\n);\n\n/* Additional tables for students, credits, groups, etc. */\n```\n\n\u003c/details\u003e\n\n### 3️⃣ Indexing Performance Analysis\n\nExperimental evaluation of database indexing strategies, measuring:\n\n- Query performance with and without indexes\n- Effect of index creation timing (before vs. after data insertion)\n- Database file size impacts\n- Performance metrics across different strategies\n\n\u003cdetails\u003e\n\u003csummary\u003eView Test Results\u003c/summary\u003e\n\n| Test Scenario | Row Insertion Time | Query Execution Time | Database Size |\n| ------------- | :----------------: | :------------------: | :-----------: |\n| No Index      |      1.50 sec      |      25.25 sec       |   19.19 MB    |\n| Index Before  |      2.03 sec      |       0.18 sec       |   30.97 MB    |\n| Index After   |      1.51 sec      |       0.17 sec       |   29.70 MB    |\n\n\u003c/details\u003e\n\n### 4️⃣ Transaction Behavior Analysis\n\nInvestigation of how multiple concurrent transactions interact in SQLite, examining:\n\n- Lock behavior between transactions\n- Transaction isolation levels\n- Conflict resolution strategies\n- Success/failure patterns in concurrent operations\n\n\u003cdetails\u003e\n\u003csummary\u003eView Transaction Test Cases\u003c/summary\u003e\n\n**Test Case Example:**\n\n```\nTransaction 1                Transaction 2\n--------------                --------------\nBEGIN;\nSELECT x FROM Test;\n                             BEGIN;\n                             SELECT x FROM Test;\n                             UPDATE Test SET x=2;\n                             COMMIT;\nUPDATE Test SET x=3;\nCOMMIT;\n```\n\n**Result Analysis:**\nTransaction isolation demonstrates that Transaction 2's changes are not visible to Transaction 1 until committed, while Transaction 1's lock prevents Transaction 2 from modifying the same data concurrently.\n\n\u003c/details\u003e\n\n### 5️⃣ NoSQL Database Queries (MongoDB)\n\nImplementation of MongoDB queries using Python to analyze real estate data:\n\n- Filtering by zip code, construction year, and apartment size\n- Transaction history analysis\n- Complex aggregation pipelines\n- Document-based data retrieval\n\n\u003cdetails\u003e\n\u003csummary\u003eView MongoDB Query Examples\u003c/summary\u003e\n\n```python\n# Finding apartments sold between 2010-2012\nmyynti_count = apartments.count_documents({\n    \"transactions\": {\n        \"$elemMatch\": {\n            \"date\": {\n                \"$gte\": \"2010-01-01\",\n                \"$lte\": \"2012-12-31\"\n            }\n        }\n    }\n})\n\n# Finding maximum selling price using aggregation\npipeline = [\n    {\"$unwind\": \"$transactions\"},\n    {\"$group\": {\"_id\": None, \"max_price\": {\"$max\": \"$transactions.selling_price\"}}},\n    {\"$project\": {\"_id\": 0, \"max_price\": 1}}\n]\nresult = list(apartments.aggregate(pipeline))\nmax_price = result[0][\"max_price\"]\n```\n\n\u003c/details\u003e\n\n## 🧠 Key Database Concepts Covered\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cb\u003eRelational Model\u003c/b\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cb\u003eNoSQL\u003c/b\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cb\u003ePerformance\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n      • SQL Queries\u003cbr\u003e\n      • Normalization\u003cbr\u003e\n      • Relationships\u003cbr\u003e\n      • Schema Design\n    \u003c/td\u003e\n    \u003ctd\u003e\n      • Document Databases\u003cbr\u003e\n      • MongoDB Queries\u003cbr\u003e\n      • Non-relational Modeling\u003cbr\u003e\n      • Aggregation Pipelines\n    \u003c/td\u003e\n    \u003ctd\u003e\n      • Indexing Strategies\u003cbr\u003e\n      • Query Optimization\u003cbr\u003e\n      • Execution Analysis\u003cbr\u003e\n      • Performance Testing\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cb\u003eTransactions\u003c/b\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cb\u003eDatabase Theory\u003c/b\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cb\u003eImplementation\u003c/b\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\n      • ACID Properties\u003cbr\u003e\n      • Concurrency Control\u003cbr\u003e\n      • Lock Management\u003cbr\u003e\n      • Conflict Resolution\n    \u003c/td\u003e\n    \u003ctd\u003e\n      • Relational Algebra\u003cbr\u003e\n      • Functional Dependencies\u003cbr\u003e\n      • Normal Forms\u003cbr\u003e\n      • Constraints \u0026 Keys\n    \u003c/td\u003e\n    \u003ctd\u003e\n      • Python Integration\u003cbr\u003e\n      • SQLite Operations\u003cbr\u003e\n      • MongoDB Access\u003cbr\u003e\n      • Performance Measurement\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## 📊 Performance Insights from Indexing Analysis\n\nThe implementation demonstrates significant query optimization through proper indexing:\n\n```\nQuery execution without index:    25.25 seconds\nQuery execution with index:       0.17 seconds\nSpeedup factor:                   ~148x\n```\n\nThis highlights how critical indexing is for real-world database performance, especially for frequently queried fields.\n\n## 🔍 Transaction Isolation Observations\n\nAnalysis of transaction behavior reveals:\n\n1. **Transaction Locks** - Active transactions can block other transactions from modifying the same data\n2. **Visibility Rules** - Changes are only visible to other transactions after being committed\n3. **Concurrent Operations** - Read operations don't block other reads, but writes can block both reads and writes\n\n## 🌐 Future Work\n\n- [ ] Implement more complex database scenarios\n- [ ] Add distributed database examples\n- [ ] Compare performance across different database engines\n- [ ] Explore advanced indexing techniques\n\n## 📖 References\n\n- Database Systems: The Complete Book\n- MongoDB Documentation\n- SQLite Documentation\n- Transaction Processing: Concepts and Techniques\n\n---\n\n\u003cdiv align=\"center\"\u003e\n  \u003csub\u003eBuilt with ❤️ by Riku Lauttia\u003c/sub\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frikulauttia%2Fdatabase-fundamentals","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frikulauttia%2Fdatabase-fundamentals","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frikulauttia%2Fdatabase-fundamentals/lists"}