none
Database Design RRS feed

  • Pertanyaan

  • Saya pemula di SQL Server.

    Saya punya table Prices yang bergantung pada mereferensi 3 table yaitu Categories, Services, Items.

    Create Table Prices
    (
       CategoryID BigInt Not Null,
       ServiceID BigInt Not Null,
       ItemID BigInt Not Null,
       Price Decimal(20,2) Not Null,
       Constraint [PK_Prices] Primary(CategoryID,ServiceID,ItemID),
       Constraint [FK_Prices_Categories] Foreign Key(CategoryID) References Categories(CategoryID),
       Constraint [FK_Prices_Services] Foreign Key(ServiceID) References Services(ServiceID),
       Constraint [FK_Prices_Items] Foreign Key(ItemID) References Items(ItemID),
    )

    Daripada menggunakan komposit primary key apakah tidak lebih baik jika saya menggunakan primary key dengan identity saja ?

    Karena jika ada table lain yang merefernsi ke table Prices (misal table Orders), ada 3 kolum yang harus direferensi di Orders apakah ini efisien ?

    * ini sekedar gambaran saja, karena ada table yang memiliki primary key gabungan 5 kolum lebih.

    Create Table Prices
    (
       PriceID BigInt Not Null Identity(1,1),
       CategoryID BigInt Not Null,
       ServiceID BigInt Not Null,
       ItemID BigInt Not Null,
       Price Decimal(20,2) Not Null,
       Constraint [PK_Prices] Primary(PriceID),
       Constraint [UNQ_Prices] UNIQUE(CategoryID,ServiceID,ItemID),
       Constraint [FK_Prices_Categories] Foreign Key(CategoryID) References Categories(CategoryID),
       Constraint [FK_Prices_Services] Foreign Key(ServiceID) References Services(ServiceID),
       Constraint [FK_Prices_Items] Foreign Key(ItemID) References Items(ItemID),
    ) 



    Sabtu, 27 Oktober 2012 03.56

Jawaban

  • Saya pemula di SQL Server.

    Saya punya table Prices yang bergantung pada mereferensi 3 table yaitu Categories, Services, Items.

    Create Table Prices
    (
       CategoryID BigInt Not Null,
       ServiceID BigInt Not Null,
       ItemID BigInt Not Null,
       Price Decimal(20,2) Not Null,
       Constraint [PK_Prices] Primary(CategoryID,ServiceID,ItemID),
       Constraint [FK_Prices_Categories] Foreign Key(CategoryID) References Categories(CategoryID),
       Constraint [FK_Prices_Services] Foreign Key(ServiceID) References Services(ServiceID),
       Constraint [FK_Prices_Items] Foreign Key(ItemID) References Items(ItemID),
    )

    Daripada menggunakan komposit primary key apakah tidak lebih baik jika saya menggunakan primary key dengan identity saja ?

    Karena jika ada table lain yang merefernsi ke table Prices (misal table Orders), ada 3 kolum yang harus direferensi di Orders apakah ini efisien ?

    * ini sekedar gambaran saja, karena ada table yang memiliki primary key gabungan 5 kolum lebih.

    Create Table Prices
    (
       PriceID BigInt Not Null Identity(1,1),
       CategoryID BigInt Not Null,
       ServiceID BigInt Not Null,
       ItemID BigInt Not Null,
       Price Decimal(20,2) Not Null,
       Constraint [PK_Prices] Primary(PriceID),
       Constraint [UNQ_Prices] UNIQUE(CategoryID,ServiceID,ItemID),
       Constraint [FK_Prices_Categories] Foreign Key(CategoryID) References Categories(CategoryID),
       Constraint [FK_Prices_Services] Foreign Key(ServiceID) References Services(ServiceID),
       Constraint [FK_Prices_Items] Foreign Key(ItemID) References Items(ItemID),
    ) 



    Mas Fakhru,

    Sebenarnya saya agak bingung dengan design table price yang mas Fakhru maksud. Karena biasanya table price itu berada di table Product. Saya liat disitu ada column ItemID. Berarti itu diambil dari table Productnya ya ? jika iya ItemID itu sudah menjadi PK di table Product sedangkan Column ServiceID dan CategoryID seharusnya sudah menjadi FK di table Product.

    Jadi jika memang column Price itu mau di Cascade lagi menjadi table Price tersendiri, seharusnya relasi antara table Product dan Table Price ada di PriceID (yang nantinya biasa dibentuk pake Identity). jadi begitu di relasikan dengan table OrdersDetail biasa direlasikan di itemID dan PriceID.

    Untuk menjawab pertanyaan mas Fakhru diatas sebenarnya kita harus kembalikan lagi esensi mengenai mengapa ada Primary Key dan mengapa harus ada relasi antar table.

    Kedua hal tersebut sebenarnya untuk menjaga terjadinya data Integrity, baik integrity dari konsistensi hubungan antar table maupun integrity di column table itu sendiri. Jadi mengenai pertimbangan efisien atau tidaknya sebuah relasi, itu harus di pandang dari sisi data integritynya.

    Jika mas Fakhru merasa 'Repot' jika menggunakan PK yang dibentuk dari kombinasi beberapa coloumn, berarti mas Fakhri harus dapat menggaransi bahwa Column Integrity di Tabel Price (untuk field CategoryID, ItemID dan ServiceID) dapat terjaga tanpa menggunakan relasi. entah itu dijaga melalui aplikasi atau cara lainnya.

    Jadi jawaban saya dari pertanyaan mas Fakhru adalah Gunakanlah PK yang dibentuk dari Identity Column Sebagai pilihan terakhir ketika memang tidak ada column atau kombinasi column yang tidak dapat mewakili keperluan tersebut.


    Demikan semoga membantu



    Regards,
    Suherman
    Profile :
    https://mvp.support.microsoft.com/profile/Suherman
    Blog : http://mugi.or.id/blogs/suherman 

        

    Minggu, 28 Oktober 2012 03.53
  • Jadi jawaban saya dari pertanyaan mas Fakhru adalah Gunakanlah PK yang dibentuk dari Identity Column Sebagai pilihan terakhir ketika memang tidak ada column atau kombinasi column yang tidak dapat mewakili keperluan tersebut.


    Regards,
    Suherman
    Profile :
    https://mvp.support.microsoft.com/profile/Suherman
    Blog : http://mugi.or.id/blogs/suherman 

        

    Saya kurang sependapat dengan pernyataan di atas. Lebih baik menggunakan single identity column sebagai primary key. Untuk menjaga supaya tiga kolom di atas tetap unik, bisa dibuatkan constraint unique key.

    Ahmad Masykur http://www.masykur.web.id/

    Selasa, 30 Oktober 2012 08.55
  • Hi Fakhru

    Terimakasih telah bergabung di Microsoft Technet Forum

    sesuai dengan saran dari Suherman, lebih baik menggunakan metode ini: menggunakan kolom identitas primary key.
    Dengan metode ini, lebih mudah untuk membuat data query dari tabel.
    Bedasarkan nama tabel, tampak bahwa satu Kategori memiliki beberapa service, salah satu service memiliki beberapa item, dan price termasuk item. Jika memang demikian, kita dapat mendefinisikan tabel seperti berikut:

    1.  Menambahkan a foreign key di Services table references Categories (CategoryID) column;
    2.  Menambahkan a foreign key di Items table references Services (ServiceID) column;
    3.  Menambahkan a foreign key di Prices table references Items (ItemID) column;

    Dengan cara ini kita dapat melihat hubungan mereka lebih jelas dan lebih mudah untuk mengelola tabel.


    Tapi Fakhru juga bisa coba menggunakan langkah dari Ahmad,karena memang identity key adalah praktek yang sederhana dan mudah dan meminimalisir replikasi data atau merge data yang berat.
    Keuntungan penggunaaan identitiy key dan constraint unique key juga baik karena mereka tidak mengizinkan duplikasi data di tabel yang sama.


    Andy Nugraha MSFT] Technet Community Support |

    Jumat, 02 November 2012 07.07
    Moderator

Semua Balasan

  • Saya pikir lebih baik digunakan identity primary key kalau kalau tidah usah pakai kolum CategoryID, ServiceID dan ItemID.  Misalnya, Orders table merefernsi Prices tetapi tidak merefernsi langsung tables Categories, Services atau Items. 

    Russel Loski, MCT, MCITP Business Intelligence Developer and Database Developer 2008 Blog: http://www.bidn.com/blogs/RussLoski/ Twitter: @sqlmovers

    Sabtu, 27 Oktober 2012 18.18
  • Saya pemula di SQL Server.

    Saya punya table Prices yang bergantung pada mereferensi 3 table yaitu Categories, Services, Items.

    Create Table Prices
    (
       CategoryID BigInt Not Null,
       ServiceID BigInt Not Null,
       ItemID BigInt Not Null,
       Price Decimal(20,2) Not Null,
       Constraint [PK_Prices] Primary(CategoryID,ServiceID,ItemID),
       Constraint [FK_Prices_Categories] Foreign Key(CategoryID) References Categories(CategoryID),
       Constraint [FK_Prices_Services] Foreign Key(ServiceID) References Services(ServiceID),
       Constraint [FK_Prices_Items] Foreign Key(ItemID) References Items(ItemID),
    )

    Daripada menggunakan komposit primary key apakah tidak lebih baik jika saya menggunakan primary key dengan identity saja ?

    Karena jika ada table lain yang merefernsi ke table Prices (misal table Orders), ada 3 kolum yang harus direferensi di Orders apakah ini efisien ?

    * ini sekedar gambaran saja, karena ada table yang memiliki primary key gabungan 5 kolum lebih.

    Create Table Prices
    (
       PriceID BigInt Not Null Identity(1,1),
       CategoryID BigInt Not Null,
       ServiceID BigInt Not Null,
       ItemID BigInt Not Null,
       Price Decimal(20,2) Not Null,
       Constraint [PK_Prices] Primary(PriceID),
       Constraint [UNQ_Prices] UNIQUE(CategoryID,ServiceID,ItemID),
       Constraint [FK_Prices_Categories] Foreign Key(CategoryID) References Categories(CategoryID),
       Constraint [FK_Prices_Services] Foreign Key(ServiceID) References Services(ServiceID),
       Constraint [FK_Prices_Items] Foreign Key(ItemID) References Items(ItemID),
    ) 



    Mas Fakhru,

    Sebenarnya saya agak bingung dengan design table price yang mas Fakhru maksud. Karena biasanya table price itu berada di table Product. Saya liat disitu ada column ItemID. Berarti itu diambil dari table Productnya ya ? jika iya ItemID itu sudah menjadi PK di table Product sedangkan Column ServiceID dan CategoryID seharusnya sudah menjadi FK di table Product.

    Jadi jika memang column Price itu mau di Cascade lagi menjadi table Price tersendiri, seharusnya relasi antara table Product dan Table Price ada di PriceID (yang nantinya biasa dibentuk pake Identity). jadi begitu di relasikan dengan table OrdersDetail biasa direlasikan di itemID dan PriceID.

    Untuk menjawab pertanyaan mas Fakhru diatas sebenarnya kita harus kembalikan lagi esensi mengenai mengapa ada Primary Key dan mengapa harus ada relasi antar table.

    Kedua hal tersebut sebenarnya untuk menjaga terjadinya data Integrity, baik integrity dari konsistensi hubungan antar table maupun integrity di column table itu sendiri. Jadi mengenai pertimbangan efisien atau tidaknya sebuah relasi, itu harus di pandang dari sisi data integritynya.

    Jika mas Fakhru merasa 'Repot' jika menggunakan PK yang dibentuk dari kombinasi beberapa coloumn, berarti mas Fakhri harus dapat menggaransi bahwa Column Integrity di Tabel Price (untuk field CategoryID, ItemID dan ServiceID) dapat terjaga tanpa menggunakan relasi. entah itu dijaga melalui aplikasi atau cara lainnya.

    Jadi jawaban saya dari pertanyaan mas Fakhru adalah Gunakanlah PK yang dibentuk dari Identity Column Sebagai pilihan terakhir ketika memang tidak ada column atau kombinasi column yang tidak dapat mewakili keperluan tersebut.


    Demikan semoga membantu



    Regards,
    Suherman
    Profile :
    https://mvp.support.microsoft.com/profile/Suherman
    Blog : http://mugi.or.id/blogs/suherman 

        

    Minggu, 28 Oktober 2012 03.53
  • Jadi jawaban saya dari pertanyaan mas Fakhru adalah Gunakanlah PK yang dibentuk dari Identity Column Sebagai pilihan terakhir ketika memang tidak ada column atau kombinasi column yang tidak dapat mewakili keperluan tersebut.


    Regards,
    Suherman
    Profile :
    https://mvp.support.microsoft.com/profile/Suherman
    Blog : http://mugi.or.id/blogs/suherman 

        

    Saya kurang sependapat dengan pernyataan di atas. Lebih baik menggunakan single identity column sebagai primary key. Untuk menjaga supaya tiga kolom di atas tetap unik, bisa dibuatkan constraint unique key.

    Ahmad Masykur http://www.masykur.web.id/

    Selasa, 30 Oktober 2012 08.55
  • Hi Fakhru

    Terimakasih telah bergabung di Microsoft Technet Forum

    sesuai dengan saran dari Suherman, lebih baik menggunakan metode ini: menggunakan kolom identitas primary key.
    Dengan metode ini, lebih mudah untuk membuat data query dari tabel.
    Bedasarkan nama tabel, tampak bahwa satu Kategori memiliki beberapa service, salah satu service memiliki beberapa item, dan price termasuk item. Jika memang demikian, kita dapat mendefinisikan tabel seperti berikut:

    1.  Menambahkan a foreign key di Services table references Categories (CategoryID) column;
    2.  Menambahkan a foreign key di Items table references Services (ServiceID) column;
    3.  Menambahkan a foreign key di Prices table references Items (ItemID) column;

    Dengan cara ini kita dapat melihat hubungan mereka lebih jelas dan lebih mudah untuk mengelola tabel.


    Tapi Fakhru juga bisa coba menggunakan langkah dari Ahmad,karena memang identity key adalah praktek yang sederhana dan mudah dan meminimalisir replikasi data atau merge data yang berat.
    Keuntungan penggunaaan identitiy key dan constraint unique key juga baik karena mereka tidak mengizinkan duplikasi data di tabel yang sama.


    Andy Nugraha MSFT] Technet Community Support |

    Jumat, 02 November 2012 07.07
    Moderator
  • Hi Fakhru

    Apakah permasalahanya telah selesai, segera membalas ke forum ini agar kita semua tahu result dari pilihan solusi Partner, MVP atau kita. Terima Kasih


    Andy Nugraha MSFT] Technet Community Support |

    Senin, 05 November 2012 03.29
    Moderator
  • Terima kasih atas balasannya.

    Ma'af saya lupa sudah memposting pertanyaan disini, karena saya tidak mendapatkan notifikasi email tentang balasan ditrit ini.
    Sesuai dengan keterangan saya diawal pertanyaan, table diatas hanyalah gambaran saja dan tapi saya berusaha agar pertanyaan:

       Daripada menggunakan komposit primary key apakah tidak lebih baik jika saya menggunakan primary key dengan identity saja ?

    Sesuai dengan jawaban Mas Suherman dan mas Ahmad Masykur, pada akhirnya saya menggunakan Primary Key dan Identity, saya juga menambahkan Unique Constraint untuk menjaga keunikan pada kolom-kolom.

    Rabu, 13 Maret 2013 14.39