Skip to content

Commit f54cbbf

Browse files
committed
DB module initial draft, without ORM section.
1 parent cc4dfdd commit f54cbbf

File tree

1 file changed

+321
-1
lines changed

1 file changed

+321
-1
lines changed
Lines changed: 321 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,321 @@
1-
# curriculum-backend-readings
1+
# Module 2: Databases
2+
3+
## Introduction to Databases
4+
In this module, you'll learn about **databases**. Database is a general term
5+
that refers to the data stored in a structured format. We use databases when we
6+
want to persist data for future use. For example, in a web application, when a
7+
user writes something in a text box, this data will be lost when the page is
8+
refreshed -- unless this data is persisted in a database.
9+
10+
Databases are a ubiquitous and foundational part of backend technology.
11+
12+
### Introduction to relational databases
13+
14+
One of the most common types of databases is the **relational database**. A
15+
relational database stores data in tables, and these tables may have *relations*
16+
to one another. For example, you may have a table `Customer`; each row
17+
represents a customer in your application. You may have another table
18+
`Order`, a customer can order many things, and each order will appear in this
19+
table. We will later look in more detail at how the two tables are linked.
20+
21+
Relational databases are frequently referred to as SQL databases. SQL is a
22+
[declarative programming
23+
language](https://365datascience.com/tutorials/sql-tutorials/sql-declarative-language/)
24+
that is commonly used to query for data. Not all relational databases
25+
necessarily use SQL, but it is by far the most common, so in practice, SQL
26+
database and relational database are synomyous terms.
27+
28+
The most frequently used relational databases are PostgreSQL and MySQL. There
29+
are many offerings for SQL databases, and each may have slightly different
30+
syntax for SQL. However, if you understand the general concept of relational
31+
databases, you will be able to easily use different databases.
32+
33+
### Understanding relational database structure
34+
As mentioned previously, data in relational databases are usually organized in a
35+
tabular format, similar to spreadsheets.
36+
37+
* A database has many tables
38+
* A table has many rows (also known as records)
39+
* A row has many columns (also known as fields).
40+
41+
For example, the previously mentioned `Customer` table may look something like
42+
the following. Note that this is not any particular syntax but simply a
43+
visualization of the data.
44+
45+
**id**|**first\_name**|**last\_name**|**registered\_at**
46+
:-----:|:-----:|:-----:|:-----:
47+
1|Ammar|Sammour|2012-01-02
48+
2|Halit|Batur|2012-01-03
49+
3|Shrreya|Bhatachaarya|2012-01-05
50+
51+
The `Order` table may look something like so:
52+
53+
**id**|**product**|**delivered**|**customer\_id**
54+
:-----:|:-----:|:-----:|:-----:
55+
1|Keyboard|TRUE|1
56+
2|Mouse|FALSE|1
57+
3|Cookies|TRUE|1
58+
4|Rice|TRUE|2
59+
60+
On the `Order` table, note that there is a field called `customer_id`. This is
61+
called a **foreign key** (or sometimes join key). This column creates a
62+
**relation** between the `Customer` and `Order` tables: it tells us to which
63+
customer the order belongs. This is the core of relational databases: expressing
64+
relations between entities.
65+
66+
This table says that Ammar has ordered a keyboard, mouse, and cookies. He has
67+
three orders, because there are three rows with `customer_id = 1`. Halit has ordered one item: rice (`customer_id = 2`).
68+
69+
### Describing relationships
70+
We usually use the terms one-to-many and many-to-many to describe
71+
relationships between tables.
72+
73+
For example, a customer may have multiple orders. This is a one-to-many relationship,
74+
since one customer has many orders. It should be noted that the foreign key goes
75+
on the side that is "many". In the example above, note that the `customer_id`
76+
key is located on the `Order` table.
77+
78+
For a many-to-many relationship, consider students and courses at a university.
79+
A student can take many courses; a course also has many students. Many-to-many
80+
relationships are [expressed slightly
81+
differently](https://dzone.com/articles/how-to-handle-a-many-to-many-relationship-in-datab) than using a single foreign key.
82+
83+
See this [StackOverflow
84+
question](https://stackoverflow.com/questions/4601703/difference-between-one-to-many-and-many-to-one-relationship)
85+
for more details.
86+
87+
### SQL queries
88+
89+
Now that we understand the general concept behind relational data, how do we
90+
query it? Note that every SQL database may have slightly different syntax in
91+
terms of quotations, capitalization, commas, etc., so be sure to check. In these
92+
examples, we will be using MySQL.
93+
94+
Suppose you have an existing MySQL database. To create the `customer` table (we
95+
will now lowercase the table names by convention), you would use the `CREATE
96+
TABLE` statement. Note that every column has a type.
97+
[`AUTO_INCREMENT`](https://www.guru99.com/auto-increment.html) is used to
98+
automatically generated the IDs.
99+
100+
```sql
101+
CREATE TABLE IF NOT EXISTS customer (
102+
task_id INT AUTO_INCREMENT PRIMARY KEY,
103+
first_name VARCHAR(255) NOT NULL,
104+
last_name VARCHAR(255) NOT NULL,
105+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
106+
)
107+
```
108+
109+
We can now add some data using `INSERT INTO`. Note that we do not need to
110+
manually provide an id or a created timestamp, these are automatically generated
111+
by MySQL.
112+
113+
```sql
114+
INSERT INTO customer (first_name, last_name) VALUES ('Halit', 'Batur');
115+
INSERT INTO customer (first_name, last_name) VALUES ('Ammar', 'Sammour');
116+
```
117+
118+
Now let's `SELECT` the data -- that is, let's view the data.
119+
```sql
120+
SELECT * FROM customer;
121+
```
122+
123+
The `*` symbol tells us to get all columns. You should see something like this:
124+
125+
```
126+
id | first_name | last_name | created_at
127+
----+------------+-----------+-------------------------------
128+
1 | Halit | Batur | 2021-08-29 03:33:14.559122-07
129+
2 | Ammar | Sammour | 2021-08-29 03:34:08.522222-07
130+
(1 row)
131+
```
132+
133+
However, you could select only certain columns by typing the name of the column:
134+
```sql
135+
SELECT first_name FROM customer;
136+
```
137+
138+
Finally, let's create a table with a foreign key, the `order` table, noting the
139+
syntax that is used to create a foreign key that references our `customer`
140+
table.
141+
142+
```sql
143+
CREATE TABLE student (
144+
id INT AUTO_INCREMENT PRIMARY KEY,
145+
product VARCHAR(255) NOT NULL,
146+
delivered BOOL,
147+
customer_id INT FOREIGN KEY REFERENCES customer(id)
148+
);
149+
```
150+
151+
### Understanding joins
152+
153+
**Join** refers to the process of combining two tables together based on a
154+
common column. In this case, for example, if we want to answer, in one query,
155+
the question: what did Ammar order? We would write a query like so:
156+
157+
```
158+
SELECT product FROM order INNER JOIN customers on orders.customer_id =
159+
customer.id WHERE customer.id = 2;
160+
```
161+
162+
On your own, try running only the first part of this query and see what happens.
163+
In your own words, what does this give you?
164+
165+
```
166+
SELECT product FROM order INNER JOIN customers on orders.customer_id;
167+
```
168+
169+
You can read more about [SQL
170+
joins](https://www.educative.io/blog/what-are-sql-joins) here. There are many
171+
types of joins, but an inner join will by far the most common one.
172+
173+
174+
### Further resources for SQL
175+
* [This repository](https://github.com/LambdaSchool/Relational-Databases) provides
176+
a good additional resource for reviewing SQL databases and some common parts of
177+
the query language.
178+
* When in doubt, you can simply Google, for example, "how to select in MySQL" and check
179+
StackOverflow.
180+
181+
182+
### SQL queries practice
183+
Now try to run some SQL queries against the tables that you created:
184+
* Create at least two new customers
185+
* Create at least three orders for each customer
186+
* Select the last names of all customers
187+
* Select the users, sorted by oldest first (hint: use Google)
188+
* Use the `LIMIT` keyword to select only one order
189+
* *Optional:* write a query that returns two columns: the ID of each user and
190+
the number of orders for that user. Hint: you need join, use `GROUP BY`, and
191+
use `COUNT(*)`. Use Google to read about these.
192+
193+
## Introduction to NoSQL databases
194+
In the past decade, **NoSQL** databases have become a popular way to store
195+
databases.
196+
There are multiple types of NoSQL databases, the most common being:
197+
* **Document**: stores data similar to JSON
198+
* **Key-value**: data is stored as a pair of key-values, with each value having
199+
a unique key that identifies it
200+
* **Graph databases**: used to store data that is represented well by the graph
201+
data structure (see the later section on neo4j)
202+
203+
### When to use SQL vs NoSQL
204+
Generally speaking, you will want to use SQL databases when your data is highly
205+
structured. SQL databases enforce a rigid structure, which is
206+
generally a good thing for type safety, documentation, and so on.
207+
208+
However, sometimes,
209+
it may be faster or more convenient not to adhere to such a rigid structure.
210+
This is one of the reasons that NoSQL database have emerged in popularity.
211+
212+
When operating at scale, SQL and NoSQL also have some differences, with SQL
213+
primarily being more robust when it comes to potential invalid or failed
214+
transactions. You can read more about this topic
215+
[here](https://www.imaginarycloud.com/blog/sql-vs-nosql/#Structure).
216+
217+
### Introduction to MongoDB
218+
[MongoDB](https://www.mongodb.com/) is the most popular NoSQL database, and it
219+
is considered a document database. MongoDB is generally considered very
220+
straightforward to use, because working with it is very similar to working with
221+
JSON, which many web developers are familiar with.
222+
223+
### General Mongo Concepts
224+
In MongoDB, a database has many collections. A collection has many documents (a
225+
collection can be considered the equivalent of a table in a relational database). A
226+
document is similar to what we know normally as JSON.
227+
228+
An example of a document, as taken from the Mongo docs, would look like the
229+
below. Note that the [_id field is present on each
230+
document](https://docs.mongodb.com/manual/core/document/#the-_id-field).
231+
```
232+
{
233+
_id: 'some_id',
234+
field1: value1,
235+
field2: value2,
236+
field3: value3,
237+
...
238+
fieldN: valueN
239+
}
240+
```
241+
242+
243+
See the [official
244+
documentation on collections](https://docs.mongodb.com/manual/core/databases-and-collections/)
245+
and [the official documentation on
246+
documents](https://docs.mongodb.com/manual/core/document/) for further reference.
247+
248+
### JavaScript
249+
To get started with MongoDB, you'll want to [follow the tutorial on the
250+
official
251+
documentation](https://www.mongodb.com/blog/post/quick-start-nodejs-mongodb--how-to-get-connected-to-your-database) for the Node.js client. Please be sure to follow the setup on this page before trying the examples.
252+
253+
### Querying in MongoDB
254+
The core of querying in MongoDB comes from the `.find()` function. We'll take a
255+
look at how it's used in JavaScript. Be sure to check the official documentation
256+
for the exhaustive options; we will only go over the basic ones.
257+
258+
If you have a collection named `customer`, you can query it as so:
259+
```
260+
const cursor = db.collection('customer').find({});
261+
```
262+
263+
The `{}` indicates that you want all documents in the `customer` collection.
264+
265+
You can filter by simply passing key-value pairs as part of the parameter:
266+
267+
```
268+
const cursor = db.collection('customer').find({ 'first_name': 'Halit' });
269+
```
270+
271+
If you want, for example, to filter using a boolean OR, you can use `$or`.
272+
[Check the example in the
273+
documentation](https://docs.mongodb.com/manual/tutorial/query-documents/#specify-or-conditions). There are a number of operators, such as `$in`, `$lt` -- skim the documentation to see what is possible in MongoDB.
274+
275+
Refer to the [official documentation for
276+
querying](https://docs.mongodb.com/manual/tutorial/query-documents/). Select
277+
JavaScript in the top-right.
278+
279+
Additionally, [MongoDB Compass] is a graphical interface that can be used to visually run
280+
Mongo queries. There is no difference other than convenience. It is useful to
281+
know how to query both in command-line and graphically.
282+
283+
### MongoDB queries practice
284+
* Create two collections, `customer` and `order`
285+
* Try to insert similar data as you did in the MySQL database, but this time in
286+
a NoSQL database
287+
* Try to do the same queries as the previous exercise, but in MongoDB (either
288+
through the command-line or JavaScript)
289+
290+
## ORMs
291+
292+
### ORM use cases
293+
294+
Discuss why ORMs exist, drawbacks, etc
295+
Code along tutorial: Install sequelize/mongoose and do basic queries to see the benefits of an ORM
296+
Describe what happens when you need to update a database. Most ORMs have some concept of migrations so it is a bit important.
297+
### ORM lab
298+
TODO
299+
300+
## Database migrations
301+
302+
## Other popular databases
303+
304+
### Elasticsearch
305+
[Elasticsearch](https://github.com/elastic/elasticsearch) is a database that
306+
specializes in the search of text. While relational databases focus on a tabular
307+
format, Elasticsearch can efficiently search through large text files, such as
308+
application logs.
309+
310+
### neo4j
311+
[neo4j](https://neo4j.com) is a [graph
312+
database](https://aws.amazon.com/nosql/graph/). These databases are optimized
313+
for data that can be represented easily by a [graph](http://web.cecs.pdx.edu/~sheard/course/Cs163/Doc/Graphs.html), a type of data structure
314+
common in programming. Graphs are generally used to represent the relationships
315+
between entities of the same type, such as in a social network (relationships between friends) or
316+
recommendation engines (relationships between movies).
317+
318+
## Conclusion
319+
You've learned a bit about the different types of databases. Think about some
320+
applications that you like to use, and ponder what types of databases they may
321+
be using. What tables might they have? What might those columns look like?

0 commit comments

Comments
 (0)