Database

Database concept, implementation, and optimization

Relational Database

  • Relational database adalah basis data yang didasarkan pada fungsi relasi seperti pada matematika
  • Data modelnya berbentuk collections of table yang merepresentasikan data dan hubungannya (relasinya) dengan tabel/data yang lain
  • Optimization

Index

  • Query get ke database adalah proses yang sangat resource consuming, terutama jika tabel memiliki data yang sangat banyak. Database perlu melakukan query satu per satu pada setiap row-nya
  • Database index adalah collection of pointers, di mana tiap pointer merujuk pada sebuah full data record yang dijadikan acuan
  • Saat kita mencari sebuah data dari database, kita akan mencari ke index terlebih dahulu. Ingat seharusnya index tidak berukuran sama atau lebih besar daripada database/tabel itu sendiri. Program akan menemukan indeks yang paling mendekati ke data yang kita cari, lalu database tinggal mencari memakai linear search biasa dimulai dari data yang ditunjuk pointer indeks tersebut

Application

SQL vs MongoDB

Aspect MySQL MongoDB
Bentuk Tabel Document
Acronym Standard query language Humongous database (bisa menyimpan data berukuran sangat besar)
Formatting Schema, karena setiap row akan memiliki format data dan kolom yang sama JSON, karena object based
Style Rigid, karena formatnya sudah hardcoded dan sudah didefinisikan schemanya Fleksibel
Data format Row-based BSON, JSON yang dikonversi ke binary via Mongo driver
Struktur komponen Sebuah database terdiri dari kumpulan tabel, dan sebuah tabel terdiri dari kumpulan row Sebuah database terdiri dari kumpulan collection (ekuivalen dengan table), dan setiap collection terdiri dari kumpulan dokumen/BSON document (ekuivalen dengan row)

SQL

  • Terdapat dua jenis query/syntax dari SQL, yaitu DDL (Data Definition Language) dan DML (Data Manipulation Language)
  • DDL digunakan untuk mendefinisikan skema data, relasi antardata, dan juga mendefinisikan constraint terhadap data tersebut

Schema Definition

  • Secara umum, syntax penulisan skema database dapat ditulis sebagai berikut,
create table r
	(A1 D1,
	A2 D2,
	...,
	An Dn,
	integrity-constraint1,
	...,
	integrity-constraintk);
  • Dengan r adalah nama relation/table, $A_i$ adalah atribut atau kolom dari r, $D_i$ adalah domain atau tipe data dari $A_i$ beserta juga batasan/spesifikasi tipe data tersebut, dan integrity-constraint berarti batasan atau spesifikasi tabel tersebut

  • Contoh syntax:

create table department
	(dept name varchar (20),
	building varchar (15),
	budget numeric (12,2),
	primary key (dept name));

Constraints

  • Constraint adalah regulasi atau hal yang mengikat database/column/key/row/data types

Domain Constraints

PostgreSQL

Instalasi

  • Arch
yay -S postgresql
initdb -D /var/lib/postgres/data

Data type

Data type Name in PostgreSQL Description
UUID uuid UUID
Character char(n) List of character dengan panjang fixed n (harus betul-betul pas segitu)
Variable character varchar(n) List of character dengan maksimal panjang n dan bisa variatif selama tidak melebihi panjang maksimal karakter
Integer int Bilangan bulat
Small integer smallint Bilangan bulat yang range-nya lebih kecil agar lebih hemat memori
Real real/double Bilangan real
Float float(n) Bilangan real, dengan presisi sampai n digit
Numerik numeric(p,d) Bilangan numerik dengan panjang p, dan d digit dari total p digit tersebut adalah kepresisian desimal. Misal numeric(3,1) memungkinkan 44.5 untuk disimpan, tapi 444.5 atau 0.32 tidak

Basic Syntax

  • Connect to Psql shell
psql
  • Show/list databases
\l
  • Switch between databases
\c database_name
  • Lists/show tables/relations
\dt
  • Create database
CREATE DATABASE database_name;

Query

NoSQL

MongoDB

Instalasi

  • Arch
yay -S mongodb
  • Windows

Basic syntax

  • Connect to Mongo shell
mongosh

Mulai dari sini, command dijalankan di mongo shell.

  • Show/list databases
show dbs
  • Switch between database
use database_name
  • Show/list collections
show collections
  • Create database
use non_existing_database_name

NOTE: database kosong tidak akan muncul saat show dbs.

  • Delete/drop database
db.dropDatabase()
  • Create collection
db.createCollection("nama_collection")
  • Delete collection
db.dropCollection("nama_collection")
  • Insert one data to collection
db.collectionName.insertOne({
  name: "John",
  age: 29,
  gpa: 3.2
})

Berhasil jika acknowledged = true.

  • Insert many data to collection
db.collectionName.insertMany([
  {
    name: "John",
    age: 29,
    gpa: 3.2
  },
  {
    name: "Alice",
    age: 29,
    gpa: 2.8
  }
])
  • Select all data from collection
db.collection_name.find()
  • Select data from collection with condition

Syntax:

db.collectionName.find({ condition }, { projection })

Equality condition:

db.collectionName.find({ fieldName: "value" })

Multiple condition (AND):

db.collectionName.find({ field1: "value1", field2: "value2" })

Non-equality condition, misalnya greater than dengan $gt:

db.collectionName.find({ price: { $gt: 100 } })

OR condition dengan $or:

db.collectionName.find({
  $or: [{ status: "active" }, { quantity: { $lt: 10 } }]
})

Select specific fields:

db.collectionName.find(
  { fieldName: "value" },
  { fieldToInclude: 1, _id: 0 }
)

// Includes fieldToInclude, excludes _id.
// Other format:
db.collectionName.find(
  { fieldName: "value" },
  { fieldToInclude: true, _id: false }
)

By default _id sudah pasti masuk, jadi kalau mau di-exclude harus dispesifikkan _id = 0.

  • Select data with limit and sort

Sort:

db.collectionName.find().sort({ name: -1 }) // dari tinggi ke rendah (descending)

Limit:

db.collectionName.find().limit(5)
  • Update one data

Syntax:

db.collectionName.updateOne({ condition }, { update })

Contoh:

db.students.updateOne(
  { name: "Spongebob" },
  { $set: { fullTime: true } }
)
db.students.updateOne(
  { _id: ObjectId("374687326asd") },
  { $set: { fullTime: false } }
)
  • Update many data
db.students.updateMany(
  {},
  { $set: { fullTime: true } }
)
  • Remove field
db.students.updateOne(
  { name: "Spongebob" },
  { $unset: { fullTime: "" } }
)
  • Check if field exist
db.students.updateMany(
  { fullTime: { $exists: false } },
  { $set: { fullTime: true } }
)
  • Delete one data from collection
db.collectionName.deleteOne({ name: "Larry" })
  • Delete multiple data from collection
db.collectionName.deleteMany({ fullTime: false })

Data type

db.collectionName.insertOne({
  name: "Larry", // string
  age: 24, // integer
  gpa: 3.9, // float
  isWorking: false, // boolean
  registerDate: new Date(), // date
  wife: null, // null object
  courses: ["Biology", "Math", "Physics"], // array
  address: {
    city: "Queens",
    province: "New York",
    zip: 12789
  } // nested document
})