Tutorial PostgreSQL - Pengembangan Struktur Database

    Pada materi kali ini, kita akan melakukan Pengembangan pada struktur database yang sebelumnya pernah kita buat.


    Sesuai dengan tujuan akhir, kita akan membuat database untuk aplikasi e-commerce. Oleh karena itu, kita akan melakukan beberapa penyesuaian pada database yang sudah ada.

Struktur Database Sebelumnya :


Temen-temen bisa mengunduh struktur database pada tautan berikut : 

Rancangan Tambahan Untuk Aplikasi E-commerce :
1. Penjual hanya bisa memiliki satu toko.
2. Setiap toko hanya memiliki satu alamat.
3. Pembeli bisa memiliki banyak alamat.
4. Setiap produk memiliki alamat (slug) unik dan gambar.
5. Pembeli bisa menyimpan produk pada keranjang.
6. Aplikasi akan terintegrasi dengan Raja Ongkir untuk mendapatkan total ongkir.

Penyesuaian Struktur Tabel
  1. Penyesuaian Tabel stores
    1. Penambahan attr user_id supaya setiap pengguna hanya bisa memiliki satu toko.



      ALTER TABLE "stores"
      ADD COLUMN "user_id" integer NOT NULL,
      ADD CONSTRAINT "fk_user_id" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE;
    2. Penambahan attr logo


      ALTER TABLE "stores"
      ADD COLUMN "logo" varchar(255);
    3. Penambahan attr deskrpsi toko



      ALTER TABLE "stores"
      ADD COLUMN "description" text;

    4. Penambahan attr slug



      ALTER TABLE "stores"
      ADD COLUMN "slug" text;
  2. Penambahan Tabel Untuk Menampung Data Raja Ongkir
    Catatan : Tabel-tabel ini akan digunakan untuk menampung data Provinsi, Kota dan Kecamatan dari Raja Ongkir.


     
    CREATE TABLE ro_provinces (
      province_id SERIAL PRIMARY KEY,
      province_name VARCHAR(255) NOT NULL
    );

    CREATE TABLE ro_cities (
      city_id SERIAL PRIMARY KEY,
      province_id INT NOT NULL,
      city_name VARCHAR(255) NOT NULL,
      postal_code CHAR(5),
      FOREIGN KEY (province_id) REFERENCES ro_provinces(province_id) ON DELETE CASCADE
    );

    CREATE TABLE ro_subdistricts (
      subdistrict_id SERIAL PRIMARY KEY,
      city_id INT NOT NULL, 
      subdistrict_name VARCHAR(255) NOT NULL,
      FOREIGN KEY (city_id) REFERENCES ro_cities(city_id) ON DELETE CASCADE
    );

  3. Penambahan Tabel store_addresses



    CREATE TABLE store_addresses (
        id SERIAL PRIMARY KEY,
        store_id INTEGER NOT NULL REFERENCES stores(id) ON DELETE CASCADE,
        district_id INTEGER NOT NULL REFERENCES ro_subdistricts(subdistrict_id) ON DELETE RESTRICT,
        location_name VARCHAR(100) NOT NULL,
        street_address TEXT NOT NULL,
        postal_code VARCHAR(10),
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

  4. Penambahan Tabel user_addresses



    CREATE TABLE user_addresses (
        id SERIAL PRIMARY KEY,
        user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
        district_id INTEGER NOT NULL REFERENCES ro_subdistricts(subdistrict_id) ON DELETE RESTRICT,
        label VARCHAR(50), -- Contoh: 'Rumah', 'Kantor'
        recipient_name VARCHAR(100) NOT NULL,
        phone_number VARCHAR(15) NOT NULL,
        street_address TEXT NOT NULL,
        postal_code VARCHAR(10),
        is_default BOOLEAN DEFAULT FALSE,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

  5. Penyesuaian Tabel products
    1. Penambahan attr slug



      ALTER TABLE products
      ADD COLUMN slug VARCHAR(191) UNIQUE NOT NULL;
    2. Penambahan attr weight



      ALTER TABLE products
        ADD COLUMN slug VARCHAR(191) UNIQUE NOT NULL;
    3. Penambahan tabel product_images
      Catatan : Tabel ini akan digunakan untuk menyimpan gambar setiap produk, rencananya satu produk bisa memiliki banyak gambar.



      CREATE TABLE product_images (
          id SERIAL PRIMARY KEY,
          product_id INTEGER NOT NULL REFERENCES products(id) ON DELETE CASCADE,
          image_url TEXT NOT NULL,
          created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      ); 
  6. Penambahan Tabel cart



    CREATE TABLE carts (
        id SERIAL PRIMARY KEY,
        user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
        product_id INTEGER NOT NULL REFERENCES products(id) ON DELETE CASCADE, 
        quantity INTEGER NOT NULL DEFAULT 1,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
  7. Penambahan Tabel payment



    CREATE TABLE payments (
        id SERIAL PRIMARY KEY,
        order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
        payment_method INTEGER NOT NULL, -- 1 = Bank Transfer, 2 = Credit Card
        payment_status INTEGER NOT NULL, -- 0 = Menunggu Pembayaran, 1 = Dibayar
        transaction_id VARCHAR(100), -- ID transaksi dari Midtrans
        bank_name VARCHAR(50), -- Nama bank yang digunakan untuk pembayaran
        va_number VARCHAR(50), -- Nomor Virtual Account (untuk Bank Transfer)
        amount NUMERIC(10, 2) NOT NULL, -- Jumlah yang dibayarkan
        paid_at TIMESTAMP, -- Waktu pembayaran
        expiration_time TIMESTAMP,
        payment_url VARCHAR(255),
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
  8. Penambahan Tabel shipping



    CREATE TABLE shippings (
        id SERIAL PRIMARY KEY,
        order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
        expedition_name VARCHAR(50) NOT NULL, -- 'JNE', 'POS Indonesia', 'Tiki', dll.
        shipping_type VARCHAR(50), -- 'REGULAR', 'OKE', 'YES', dll.
        estimated_delivery_time VARCHAR(20), -- '1 - 2 Hari'.
        tracking_number VARCHAR(100),
        shipped_at TIMESTAMP, -- Waktu pengiriman
        delivered_at TIMESTAMP, -- Waktu diterima
        courier_code VARCHAR(50),
        weight NUMERIC(10, 2),
        cost NUMERIC(10, 2),
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

    CREATE TABLE shipping_addresses (
        id SERIAL PRIMARY KEY,
        shipping_id INTEGER NOT NULL REFERENCES shippings(id) ON DELETE CASCADE,
        origin_district_id INTEGER NOT NULL,
        origin_district_name VARCHAR(255) NOT NULL,
        origin_city_id INTEGER NOT NULL,
        origin_city_name VARCHAR(255) NOT NULL,
        origin_province_id INTEGER NOT NULL,
        origin_province_name VARCHAR(255) NOT NULL,
        recipient_name VARCHAR(255) NOT NULL,
        recipient_phone VARCHAR(20) NOT NULL,
        street_address VARCHAR(255) NOT NULL,
        postal_code VARCHAR(10),
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
  9. Penyesuaian Tabel orders



    ALTER TABLE orders
        ADD COLUMN order_status INTEGER NOT NULL DEFAULT 0; -- 0 = Menunggu, 1 = Diproses, 2 = Dikirim, 3 = Selesai, 4 = Dibatalkan

    ALTER TABLE orders
        ADD COLUMN order_number VARCHAR(50) UNIQUE;

    ALTER TABLE orders
        ADD COLUMN notes TEXT;

    Pengembangan Sturktur Database telah selesai kita lakukan, dengan pengembangan ini sudah sangat cukup untuk kita membuat aplikasi e-commerce. Setelah ini, teman-teman dapat melanjutkan ke seri tutorial Laravel untuk membangun API menggunakan database yang telah dibuat.

Struktur akhir database : 



Temen-temen bisa mengunduh database hasil pengembangan pada link berikut :

    Mungkin itu saja yang bisa kita pelajari pada materi kali ini. Semoga materinya dapat memberikan sedikit gambaran bagi temen-temen mengenai struktur database untuk e-commerce. Jika teman-teman memiliki pertanyaan atau ingin berbagi pengalaman, silakan ketikkan pada kolom komentar di bawah.

Sedikit Tentang Saya :

    Sebagai seorang programmer profesional dengan pengalaman sekitar 4 tahun di bidang IT, saya siap membantu Anda dengan berbagai kebutuhan konsultasi.

Jangan ragu untuk menghubungi saya melalui WhatsApp.

Sampai jumpa di tutorial berikutnya!

Kontak Saya :
Email : ronisurya.115@gmail.com
WhatsApp : 081222821596
Website : Roni Surya

Lebih baru Lebih lama