Kami memiliki tabel dasar yang mendefinisikan bagian-bagian dan menyimpan informasi seperti nomor bagian, deskripsi, harga, berat, dll. Kami juga memiliki sekitar 400 tabel yang mereferensikan tabel dasar dan memberikan informasi tambahan tentang bagian-bagian berdasarkan jenis / kategorinya.
Kami mulai dengan menggunakan batasan kunci asing sehingga bagian tidak dapat dihapus dari tabel dasar jika direferensikan di salah satu dari 400 tabel bagian tertentu tetapi kami dengan cepat mencapai 253 kunci asing yang disarankan untuk SQL Server 2005.
Apakah ada alternatif selain kunci asing dalam situasi ini yang akan memastikan integritas data? Kami belum melihat masalah kinerja saat mengakses data tetapi memperbarui bagian yang ada di tabel dasar akan gagal karena rencana kueri terlalu rumit.
sumber
Jawaban:
Jika ada cara untuk mengelompokkan bagian, Anda mungkin bisa memperkenalkan tabel perantara sebagai solusi. Ini tidak akan berhasil.
Tetapi sesuatu di sepanjang garis ini mungkin.
Saya ingin melihat DDL Anda dengan saksama sebelum saya merekomendasikan ini. Dan jika Anda melakukan ini, jangan mulai melemparkan nomor ID di semua tempat. Anda harus dapat bergabung dengan "Tabel 400" langsung ke "Bagian" tanpa termasuk "Bagian GreenBlueIndigoViolet".
sumber
Jika Anda benar-benar tidak dapat menggabungkan tabel, mengapa tidak membuat a
TRIGGER
di tabel dasar untuk mencegah penghapusan?Mulai di sini: http://msdn.microsoft.com/en-us/library/ms189799(v=sql.90).aspx
sumber
Ganti 400+ tabel dengan satu. Hanya perlu 3 bidang (+1 autonumber atau kunci utama apa pun jika Anda menginginkannya, tidak harus memilikinya, Anda dapat mengeluarkannya dari bidang lain)
Item ID Nilai Atribut
Jadi di mana dalam tabel Anda yang lain, masing-masing bidang mewakili atribut, dalam tabel ini, atribut Anda semuanya dalam satu bidang. Anda akan memiliki sesuatu seperti ini
Nilai Atribut ItemID
Bahan Sock Wool
Warna Kaus Kaki Merah
Berat Kaus Kaki 20 pound
Alien Planet Alpha Centauri
Warna Alien Ungu
Alien Friendly No
ItemIDs mungkin harus berupa angka / alfanumerik. Kemudian, Anda hanya crosstab dengan Atrribut sebagai header kolom bila perlu untuk menghasilkan tabel seperti yang Anda suka. Ini juga memungkinkan untuk pertanyaan yang lebih baik untuk hal-hal seperti "Tunjukkan semua item yang berasal dari Alpha Centauri" yang dapat memberi Anda kembali Alien dan juga fragmen Meteorit yang berisi wabah yang menyapu umat manusia (datang .....)
Optimalisasi mungkin rumit tergantung pada berapa banyak catatan yang ada tetapi ini adalah cara yang jauh lebih baik untuk merancang ini. Saya melakukan hal yang sama untuk database yang berisi banyak resep (10k +) yang memiliki beberapa tumpang tindih. Bekerja dengan baik dalam hal itu. Benar-benar tidak memiliki masalah kecepatan. Milik Anda mungkin lebih sulit tergantung pada berapa banyak yang Anda hadapi.
sumber
Entity
,Entity_Attribute
,Entity_Attribute_Value
). Jika Anda ingin menambahkan perlakuan semi-tepat untuk tipe data dan batasan referensial yang berbeda, Anda akan membutuhkan lebih banyak.