Minggu, 30 November 2014

Praktikum DBD Laporan 9

KONEKSI DATABASE KE  NETBEANS

Terdapat beberapa langkah yang secara umum harus dilakukan sehingga aplikasi yang berbasis Java dapat berinteraksi dengan database server. Langkah-langkah tersebut sebagai berikut :
1. Impor package java.sql
2. Memanggil Driver JDBC
3. Membangun Koneksi
4. Membuat Statement
5. Melakukan Query
6. Menutup Koneksi

1. Impor package java.sql
Pertama-tama yang harus dilakukan sebelum Anda membuat program JDBC adalah mengimpor package java.sql terbih dahulu, karena di dalam package java.sql tersebut terdapat kelas-kelas yang akan digunakan dalam proses-proses berintekasi dengan database server misalnya kelas DriverMaganer, Connection, dan ResultSet.
Hal ini sangat penting dilakukan karena bagi pemula seringkali lupa untuk mengimpor package yang kelas-kelas yang akan digunakan terdapat di dalamnya, sehingga mengakibatkan kegagalan dalam mengkompile program Java.
Adapun listing untuk mengimpor package java.sql adalah sebagai berikut : " Import java.sql.*; "
Listing ini dituliskan sebelum Anda menulis kelas.

2. Memanggil Driver JDBC
Langkah pertama untuk melakukan koneksi dengan database server adalah dengan memanggil JDBC Driver dari database server yang kita gunakan. Driver adalah library yang digunakan untuk berkomunikasi dengan database server. Driver dari setiap database server berbeda-beda, sehingga Anda harus menyesuaikan Driver JDBC sesuai dengan database server yang Anda gunakan.
Berikut ini adalah listing program untuk memanggil driver JDBC." Class.forName(namaDriver); atau Class.forName(namaDriver).newInstance();"


3. Membangun Koneksi

Setelah melakukan pemanggilan terhadap driver JDBC, langkah selanjutnya adalah membangun koneksi dengan menggunakan interface Connection. Object Connection yang dibuat untuk membangun koneksi dengan database server tidak dengan cara membuat object baru dari interface Connection melainkan dari class DriverManager dengan menggunakan methode getConnection(). Connection koneksi = DriverManager.getConnection(<argumen>);

4. Membuat Statement
JDBC API menyediakan interface yang berfungsi untuk melakukan proses pengiriman statement SQL yang terdapat pada package java.sql. Statement yang ada secara umum digunakan terdiri dari berikut : Statement
Interface ini dibuat oleh methode Connection.createStatement(). Object Statement digunakan untuk pengiriman statement SQL tanpa parameter serta Setiap SQL statement yang dieksekusi dikirim secara utuh ke database. Statement stat = Connection.createStatement(); PreparedStatement
Interface ini dibuat oleh methode Connection.prepareStatement(). Object PreparedStatement digunakan untuk pengiriman statement SQL dengan atau tanpa parameter. Interface ini memiliki performa lebih baik dibandingkan dengan interface Statement karena dapat menjalankan beberapa proses dalam sekali pengiriman perintah SQL, pengiriman selanjutnya hanya parametered querynta saja. PreparedStatement stat = Connection.prepareStatement();

5. Melakukan Query
Setelah kita memiliki object statement, kita dapat menggunakannya untuk melakukan pengiriman perintah SQL dan mengeksekusinya. Methode eksekusi yang digunakan untuk perintah SQL terbagi menjadi dua bagian yaitu untuk perintah SELECT methode eksekusi yang digunakan adalah executeQery() dengan nilai kembaliannya adalah ResultSet, dan untuk perintah INSERT, UPDATE, DELETE methode eksekusi yang digunakan adalah executeUpdate().

6. Menutup Koneksi
Penutupan terhadap koneksi database perlu dilakukan agar sumber daya yang digunakan oleh object Connection dapat digunakan lagi oleh proses atau program yang lain. Sebelum kita menutup koneksi database, kita perlu melepas object Statement dengan kode sebagai berikut : statement.close();
Untuk menutup koneksi dengan database server dapat kita lakukan dengan kode sebagai berikut : connection.close();

Praktek

Buatlah package baru java netbens
Buat class java gui JFrame
Buatlah seperti gambar di bawah
Buatlah database dari postges


1. membuat method koneksi:
tambahkan method koneksi dengan code :
 void Koneksi() {
        try {
            String connectionURL = "jdbc:postgresql://localhost:5432/dimas13650064";
            String username = "postgres";
            String password = "password";
            Class.forName("org.postgresql.Driver");
            connection = DriverManager.getConnection(connectionURL, username, password);
            System.err.println("Sukses Koneksi");
        } catch (Exception ex) {
            System.err.println("Tidak Berhasil Koneksi");
            System.exit(1);
        }
    }
ket =
isi user name dengan = user postgres anda
isi password dengan = password anda di postgres
isi jdbc:postgresql......./dimas13650064 bisa di isi dengan nama data base anda

2.tampilan gui


3. mengisi tombol table, klik 2 kali pada desaign gui

tombol simpan

tombol cari

tombol edit

tombol delete

tombol tampilkan

tombol reset

4. action tombol pada table tanpa menulis driver jdbc, url dan koneksi, buat di bawah javax.swing.JFrame = "Connection connection;"

tombol simpan

tombol cari

tombol edit

tombol hapus

tombol tampilkan


kesimpulan


untuk pengaplikasian database bisa dengan cara diatas yaitu membuat koneksi progam ke dalam databese. hal ini sangat membantu dalam penyimpanan data dari sebuah aplikasi

Senin, 24 November 2014

Praktikum DBD Laporan 8

Teori

FUNGSI

Fungsi SQL adalah sebuah kumpulan query, biasanya query yang detail dan panjang yang dibungkus menjadi satu dan disimpan dalam database dan kemudian apabila diperlukan hanya tinggal mengaksesnya tanpa mengetikan query detail. Sedangkan untuk memunculkan fungsi dapat menggunakan query \df.
Ada beberapa konsep yang menarik dari fungsi antara lain:
• Bahasa yang dipakai dapat didefenisikan sendiri dengan tersedianya parameter LANGUAGE.
• Kita dapat membuat dua buah fungsi dengan nama yang sama namun parametermasukkannya yang berbeda, baik tipe data maupun jumlahnya.
Ada beberapa faktor yang perlu diperhatikan dalam membuat fungsi antara lain:
• Nama Fungsi
• Nomor dari fungsi argument
• Tipe data dari setiap argument
• Tipe dari hasil fungsi
• Fungsi action
• Bahasa yang digunakan oleh fungsi action.

berikut sintak umum fungsi

CREATE
    [DEFINER = { user | CURRENT_USER }]
    FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

TRIGGER

rigger digunakan untuk menyisipkan sebuah fungsi pada saat suatu record di-INSERT, UPDATE dan DELETE. Trigger sangat ideal untuk mengecek atau memodifikasi sebuah data pada kolom sebelum dimasukkan ke dalam database, sehingga sebuah fungsi dapat dipanggil setiap saat secara otomatis ketika sebuah row akan dimodifikasi. Ciri khas dari fungsi yang diperuntukkan untuk trigger adalah menghasilkan output bertipe OPAQUE. Tipe opaque adalah sebuah tipe yang menginformasikan pada database bahwa fungsi tersebut tidak menghasilkan satu dari tipe data yang ditetapkan SQL dan tidak secara langsung dapat digunakan dalam statemen SQL. Language (bahasa) PL/PGSQL dapat digunakan untuk trigger procedure, fungsi untuk trigger ini memiliki beberapa variabel khusus yang terdeklarasi secara otomatis.
Variabel tersebut antara lain:

• NEW: Variabel yang berisi nilai baru suatu record pada saat INSERT atau UPDATE, bertipe RECORD.

• OLD: Variabel yang berisi nilai lama suatu record pada saat UPDATE atau DELETE, juga bertipe RECORD.

berikut sintak umum trigger

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_body

Praktek




1. membuat fungsi konversi dari farenheit ke celcius dengan sintak "create function konversi ($1 float) returns float return (($1-32)/1.9);"



2. membuat fungsi mencari alamat dari nama di table mahasiswa dengan sintak "create function alamat_mah (nama varchar (20)) returns text begin declare alamat text; select alamat_mah into alamat from mahasiswa where nama_mah = nama; return alamat; end $"



3. membuat fungsi menghitung
 
dengan sintak "create function nilai (hasil varchar(11)) returns varchar(11) begin declare hasilnya varchar(20); case when hasil >100 or hasil <0 then set hasilnya = "nilai salah"; when hasil >=90 then set hasilnya = "nilai A"; when hasil >=70 then set hasilnya = "nilai B"; when hasil >=60 then set hasilnya = "nilai C"; when hasil >=50 then set hasilnya = "nilai D"; when hasil <50 then set hasilnya = "nilai E"; else set hasilnya = "F"; end case; return hasilnya; end$"



4. membuat fungsi untuk menentukan nilai ganjil atau genap dengan sintak "create funcition cari5 (bilangan varchar (10)) returns varchar (10) begin declare angka varchar (10); if bilangan % 2 != 0 then set angka ="ganjil"; else set angka ="genap"; end if; return angka; end$"

5. untuk nomer 5 maaf belum bisa,, mungkin pada kesempatan selanjutnya akan saya lengkapi

perbedaan MySQL dengan Postgre

1. pada penggunaan funcition di Postgre di tuliskan bahasa yang digunakan (LANGUAGE 'sql') namun pada MySQL tidak harus
2. di akhir funcition pada MySQL harus ada (end$) namun pada Postgre tidak harus

kesimpulan

untuk mempermudah melakukan pengambilan / pengecekan / pemasukan data pada database kita dapat menggunakan funcition dan di tambah dengan triger untuk lebih spesifiknya pada sebuah table

sumber

http://mysql.phi-integration.com/sql/membuat-trigger-di-mysql
http://dendieisme.blogspot.com/2009/03/membuat-function-di-mysql.html
http://fickaajah.blogspot.com/2012/03/profesinalisme-guru.html
http://ahwat.blogspot.com/2012/05/membuat-function-di-mysql.html
https://ar3t4.wordpress.com/2014/04/16/belajar-trigger-stored-procedure-function-dan-view-di-mysql/

Minggu, 09 November 2014

Praktikum DBD Laporan 7

         Subquery atau query Nested merupakan bentuk query yang terdapat dalam query yang lain. Subquery dapat ditempatkan dalam klausa where, having, from bersama dengan operator perbandingan seperti = untuk baris tunggal dan untuk baris berganda menggunakan in, not in atau <>, < any, >, >=,<=. Penggunaan sub query dapat diterapkan pada pernyataan SELECT, UPDATE, DELETE, dan INSERT.

Kegunaan-kegunaan  Subquery dalam memanipulasi data:

  1.  Meng-copy data dari satu tabel ke tabel lain
  2.  Menerima data dari inline view
  3.  Mengambil data dari tabel lain untuk kemudian di update ke tabel yang dituju
  4.  Menghapus baris dari satu tabel berdasarkan baris dari tabel lain.
ATURAN SUB QUERY

         Klausa ORDER BY tidak boleh digunakan .di subquery. ORDER BY dapat digunakan ,di pernyataan SELECT luar. Klausa subquery SELECT harus beisi satu nama kolom tunggal atau ekspresi kecuali untuk subquery-subquery menggunakan kata kunci EXIST. secara default, nama-nama kolom di subquery mengacu ke nama table diklausa FROM di query lebih luar dengan mengkualifikasi nama kolom Saat subquery adalah salah satu dua operan dilibatkan di pembandingan, subquery harus muncul di sisi kanan pembandingan.

SELECT select_list FROM table WHERE expr operator ( SELECT select_list FROM table );

Operator EXIST dan NOT EXIST

     Kata kunci EXIST dan NOT EXIST dirancang hanya untuk digunakan di subquery. Kata kunci-kata kunci ini menghasilkan nilai TRUE atau FALSE EXIST akan mengirim nilai TRUE jika dan hanya jika terdapat sedikitnya satu baris di table hasil yang dikirim oleh subquery. EXIST mengirim nilai FALSE jika subquery mengirm table kosong NOT EXIST kebalian dan EXIST. Karena EXIST dan NOT EXIST hanya memeriksa keberadaan baris-baris di table hasil subquery.

Operator Any(Some)

Operator Any (some) hampir sama penggunaannya seperti Exists. Tetapi operator relasi yang digunakan biasanya selain = (sama dengan). hal tersebut disebabkan apabila operator relasi = yang digunakan, maka sebetulnya fungsi operator Any (some) sama seperti operator IN, sehingga kondisi seperti itu tidak dianjurkan karena lebih mudah pemahamannya apabila menggunakan operator IN.

Operator All

Operator all digunakan untuk melakukan pembandingan dengan sub query. Kondisi dengan all menghasilkan nilai benar jika pembandingan menghasilkan benar untuk setiap nilai dalam sub query.

Indeks

        Indeks disini berguna dalam suatu pencarian nilai atau data dalam database. Dalam suatu kasus ketika mengakses sebuah tabel biasanya DBMS akan membaca seluruh tabel baris perbaris hingga selesai. Ketika baris sangat banyak dan hasil dari query hanya sedikit, maka hal ini sangat tidak efisien. Seperti halnya ketika kita membaca sebuah buku dan ingin mencari kata atau istilah tertentu dalam buku maka biasanya akan di cari dengan membuka setiap halaman dari awal sampai akhir. Dengan adanya indeks buku maka kita cukup dengan membuka indeks, sehingga akan cepat dalam pencarian kata tersebut.

Sintaks untuk membuat Index:

CREATE INDEX index_name 
ON table_name (column_name1,column_name2...); 

Sintaks untuk membuat Index unik SQL:

CREATE UNIQUE INDEX index_name 
ON table_name (column_name1,column_name2...); 

KOLOM UNIK

       Unique berfungsi untuk menjaga agar tidak terjadinya duplikasi nilai (kesamaan data) dalam sebuah kolom, hal ini dapat ditangani dengan membuat sebuah indeks unik atau fungsi unik sendiri pada kolom yang dimaksud. Unique ini sering digunakan dalam pembuatan bukan primary key namun membutuhkan cek dupikasi agar tidak ada yang sama, karena dalam primary key sudah otomatis mempunyai sifat unik. Berikut Struktur SQL saat pembuatan tabel baru :

CREATE TABLE nama_tabel (nama_kolom tipe_data unique);

ALTER TABLE nama_tabel ADD UNIQUE (nama_kolom);

Untuk menghapus unique berikut caranya :

ALTER TABLE nama_table DROP CONSTRAINT NAMA_CONSTRAIN

Penggunaan TRIM

       Suatu ketika pasti akan memiliki data yang di dalamnya terdapat spasi kosong yang tidak diperlukan, misalnya spasi ganda. Jika ada masalah seperti ini, kita dapat membersihkan spasi-spasi kosong yang tidak diperlukan menggunakan fungsi TRIM, RTRIM, dan LTRIM. Ketiga fungsi ini memiliki bentuk penggunaan sebagai berikut :
- RTRIM : digunakan untuk membersihkan spasi kosong yang ada di bagian kanan (Right) String.
- LTRIM : digunakan untuk membersihkan spasi kosong yang ada di bagian kiri (Left) String.
- TRIM : digunakan untuk membersihkan spasi kosong yang ada di bagian kiri, kanan, maupun tengah String
Berikut Struktur SQL nya :
Select trim(nama_kolom) from nama_tabel;
Dalam penggunaannya, fungsi TRIM memiliki tiga opsi. Ketiga opsi ini dapat digunakan untuk menentukan karakter apa yang akan dihapus dari suatu String. Jadi, fungsi TRIM juga dapat menghilangkan karakter tertentu (bukan spasi kosong saja) dari suatu string. Opsinya sebagai berikut :
- LEADING : merupakan opsi untuk menghilangkan karakter terpilih yang ada di sebelah kiri. Parameter Leading diartikan sebagai sufik dari karakter yang ada.
- TRAILING : merupakan opsi untuk menghilangkan karakter terpilih yang ada di sebelah kanan String. Parameter Trailing diartikan sebagai sufik dari karakter yang ada.
- BOTH : merupakan opsi yang dapat menangani parameter Leading maupun Trailing.
Berikut Struktur SQL nya :

Select trim(LEADING ‘karakter, misal : -’ from nama_kolom) from nama_tabel;

Praktek

1. Menampilkan nama fakultas dan jumlah mahasiswa yang mampunyai ketentuan nama fakultas yang dimunculkan dengan jumlah mahasiswanya terkecil

2. Menampilkan nama mahasiswa, nama fakultas, alamat dengan syarat nama fakultas sama dengan edi dan alamatnya tidak sama dengan luki

3. Membuat index di tabel mahasiswa(alamat). Kemudian buat  lagi index yang bersifat unik pada  tabel  fakultas(fak_nama)  kemudian amati perbedaannya  ketika memasukkan data yang sama!



4. Buat  kolom nama di mahasiswa menjadi unik dan inputkan 2 data yang sama. Kemudian amati

  
5. Pindahkan data dari tabel mahasiswa, fakultas ambil kolom nim, nama mahasiswa, alamat, nama fakultas ke tabel baru yang dinamai "identitas".

6. Buatlah contoh penggunaan check pada sub bab pembahasan CHECK. Kemudian masukkan               beberapa data baik yang sesuai dengan criteria check maupun yang bukan dan amati perbedaannya
.
7. Inputkan data di  tabel mahasiswa dimana pada kolom nama sebelum inputkan karakter dahulukan dengan spasi dan di  akhiri  dengan  tanda  “+” seperti  berikut  :  “   paloh+++”. kemudian munculkan seluruh data dan hilangkan spasi didepan!


8. Munculkan data mahasiswa dengan hilangkan karakter “+” di akhir data dan karakter “a” di awal         kata pada kolom nama!



PERBEDAAN MYSQL dan POSTGRE SQL PADA SUB QUERY DAN INDEKS

- Ketika drop index menggunakan postgreSQL, perintah yang  digunakan adalah
Drop index nama_index;
 Sedangkan pada MySQL menggunakan perintah :
Alter table nama_table_dari_Index drop index nama_index;

- Ketika memindahkan data dari tabel mahasiswa di PostgreSQL cukup memberikan perintah kolom mana yang ingin ditampilkan kemudian langsung memasukkan kedalam tabel identitas seperti berikut
Select nim_mah, nama_mah, alamat_mah, nama_fak into identitas from mahasiswa, fakultas;
Sedangkan di MySQL harus membuat tabel setelah itu baru memasukkan kolom ke dalam tabel identitas,perintahnya sebagai berikut :
Create table identitas select nim_mah, nama_mah, alamat_mah, nama_fak from mahasiswa, fakultas where mahasiswa.id_fak=fakultas.id_fak;


KESIMPULAN

Select into statement merupakan query  SQL yang digunakan untuk mengopi informasi dari tabel ke tabel yang lain tanpa membuat tabel sebelumnya. Subquery ialah bentuk query yang terdapat dalam query yang lain. Indeks berguna dalam suatu pencarian nilai atau data dalam database. Unique berfungsi untuk menjaga agar tidak terjadinya duplikasi nilai (kesamaan data) dalam sebuah kolom, hal  ini dapat ditangani dengan membuat sebuah indeks  unik atau fungsi unik sendiri pada kolom yang dimaksud. Check tidak berlaku dalam MySQL, namun dalam PostgreSQL ada. Trim digunakan untuk menghapus spasi dan karakter yang berlebih.


sumber 

http://catatankuliahum.blogspot.com/2013/02/sub-query-basis-data.html
http://codeoke.blogspot.com/2012/12/sub-query-mysql.html
http://beginner-sql-tutorial.com/id/sql-index.htm

Minggu, 02 November 2014

Praktikum DBD Laporan 6

Normalisasi

Normalisasi adalah proses pembentukan struktur basis data sehingga sebagian besar data yang bersifat ambigu bisa dihilangkan.

Proses Normalisasi sebagai berikut  :

  • Data diuraikan dalam bentuk tabel, selanjutnya dianalisis berdasarkan persyaratan tertentu ke beberapa tingkat.
  • Apabila tabel yang diuji belum memenuhi persyaratan tertentu, maka tabel tersebut perlu dipecah menjadi beberapa tabel yang lebih sederhana sampai memenuhi bentuk yang optimal.
Macam - macam Bentuk Normalisasi :

1. (UNNORMALIZED FORM) adalah kumpulan data yang akan direkam, tidak ada keharusan mengikukti format tertentu, dapat saja data tidak lengkap atau terduplikasi. Data dikumpulkan apa adanya sesuai dengan saat menginput.

2. (1st Normal Form)  Pada tahap ini dilakukan penghilangan beberapa group elemen yang berulang agar menjadi satu harga tunggal yang berinteraksi di antara setiap baris pada suatu tabel, dan setiap atribut harus mempunyai nilai data yang atomic (bersifat atomic value). Atom adalah zat terkecil yang masih memiliki sifat induknya, bila terpecah lagi maka ia tidak memiliki sifat induknya. Aturan :
  • Tidak adanya atribut multi-value, atribut komposit atau kombinasinya
  • Mendefinisikan atribut kunci.
  • Setiap atribut dalam tabel tersebut harus bernilai atomic (tidak dapat dibagi-bagi lagi)
3. (2nd Normal Form) Bentuk normal kedua didasari atas konsep full functional dependency (ketergantungan fungsional sepenuhnya) yang dapat didefinisikan sebagai berikut. Jika A adalah atribut-atribut dari suatu relasi, B dikatakan full functional dependency (memiliki ketergantungan fungsional terhadap A, tetapi tidak secara tepat memiliki ketergantungan fungsional dari subset (himpunan bagian) dari A. Aturan :
  • Sudah memenuhi dalam bentuk normal kesatu (1NF)
  • Semua atribut bukan kunci hanya boleh tergantung (functional dependency) pada atribut kunci
  • Jika ada ketergantungan parsial maka atribut tersebut harus dipisah pada tabel yang lain
  • Perlu ada tabel penghubung ataupun kehadiran foreign key bagi atribut-atribut yang telah dipisah tadi
4. (3rd Normal Form) Syarat / aturan pada 3NF :
  • Sudah berada dalam bentuk normal kedua (2NF)
  • Tidak ada ketergantungan transitif (dimana atribut bukan kunci tergantung pada atribut bukan kunci lainnya).
5. Boyce-Codd Normal Form (BCNF) syarat / aturan pada BCNF :
  • Bentuk BCNF terpenuhi dalam sebuah tabel, jika untuk setiap functional dependency terhadap setiap atribut atau gabungan atribut dalam bentuk: X  Y maka X adalah super key
  • tabel tersebut harus di-dekomposisi berdasarkan functional dependency yang ada, sehingga X menjadi super key dari tabel-tabel hasil dekomposisi
  • Setiap tabel dalam BCNF merupakan 3NF. Akan tetapi setiap 3NF belum tentu termasuk BCNF . Perbedaannya, untuk functional dependency X  A, BCNF tidak membolehkan A sebagai bagian dari primary key.
6. (4th Normal Form /4NF) Syarat / aturan pada 4NF :
  • Bentuk normal 4NF terpenuhi dalam sebuah tabel jika telah memenuhi bentuk BCNF, dan tabel tersebut tidak boleh memiliki lebih dari sebuah multivalued atribute
  • Untuk setiap multivalued dependencies (MVD) juga harus merupakan functional dependencies
7. (5th Normal Form /5NF) Syarat / aturan 5NF :
  • Bentuk normal 5NF terpenuhi jika tidak dapat memiliki sebuah lossless decomposition menjadi tabel-tabel yg lebih kecil.
  • Jika 4 bentuk normal sebelumnya dibentuk berdasarkan functional dependency, 5NF dibentuk berdasarkan konsep join dependence. Yakni apabila sebuah tabel telah di-dekomposisi menjadi tabel-tabel lebih kecil, harus bisa digabungkan lagi (join) untuk membentuk tabel semula
Praktek Noramalisasi
soal 

1. Bentuk dahulu unnormalisaisnya seperti dibawah ini : 


2. Bentuk normal pertama atau 1NF, dengan membuat dari data unnormalisasi 

3. Bentuk normal kedua, dengan mengambil atribut kunci setiap data sehingga membentuk table-table baru:

table anggota, 

table nota,

table buku


4. Bentuk normal ketiga, dengan mengurangi ketergantungan antar field didalam table. sehingga membentuk : 
table anggota, 


table nota, 

table pinjaman,

table kasir, 

table jamainan, 

table jenis, 

table buku

berikut ini adalah ERD dari 3NF :


Kesimpulan 
untuk membuat sebuah data base yang besar perlu diperhatikan penggunaan normalisai karena, normalisasi dibutuhkan untuk mengurangi pengulangan data, kerancauan dll, yang bisa membuat data menjadi ganda

sumber :

http://jewyner.wordpress.com/category/pengertian-normalisasi-data-base-dan-contohnya/
http://www.slideshare.net/adherianto/normalisasi-data