Normalisasi tabel operasional Anda seperti yang disarankan oleh Transact Charlie, adalah ide yang baik, dan akan menghemat banyak sakit kepala dan masalah seiring waktu - tetapi ada hal-hal seperti tabel antarmuka , yang mendukung integrasi dengan sistem eksternal, dan tabel pelaporan , yang mendukung hal-hal seperti analitis pengolahan; dan tipe-tipe tabel itu tidak harus dinormalisasi - pada kenyataannya, sangat sering itu jauh, jauh lebih nyaman dan berkinerja bagi mereka untuk tidak .
Dalam hal ini, saya pikir proposal Transact Charlie untuk tabel operasional Anda adalah yang baik.
Tapi saya akan menambahkan indeks (tidak harus unik) ke CompetitorName di tabel Pesaing untuk mendukung sambungan efisien di CompetitorName untuk keperluan integrasi (memuat data dari sumber eksternal), dan saya akan menempatkan tabel antarmuka ke dalam campuran: CompetitionResults.
CompetitionResults harus berisi data apa pun yang dimiliki hasil kompetisi Anda di dalamnya. Maksud dari tabel antarmuka seperti ini adalah untuk membuatnya secepat dan semudah mungkin untuk memotong dan memuatnya kembali dari lembar Excel atau file CSV, atau dalam bentuk apa pun Anda menyimpan data tersebut.
Tabel antarmuka itu tidak boleh dianggap sebagai bagian dari set tabel operasional yang dinormalisasi. Kemudian Anda dapat bergabung dengan CompetitionResults seperti yang disarankan oleh Richard, untuk menyisipkan catatan ke dalam Pesaing yang belum ada, dan memperbarui yang ada (misalnya jika Anda benar-benar memiliki informasi lebih lanjut tentang pesaing, seperti nomor telepon atau alamat email mereka).
Satu hal yang ingin saya catat - dalam kenyataannya, Nama Pesaing, bagi saya, tampaknya sangat unik dalam data Anda . Dalam 200.000 pesaing, Anda mungkin memiliki 2 atau lebih David Smiths, misalnya. Jadi saya sarankan Anda mengumpulkan lebih banyak informasi dari pesaing, seperti nomor telepon atau alamat email mereka, atau sesuatu yang lebih cenderung unik.
Tabel operasional Anda, Pesaing, seharusnya hanya memiliki satu kolom untuk setiap item data yang berkontribusi terhadap kunci alami komposit; misalnya harus memiliki satu kolom untuk alamat email utama. Tetapi tabel antarmuka harus memiliki slot untuk nilai lama dan baru untuk alamat email utama, sehingga nilai lama dapat digunakan untuk mencari catatan di Pesaing dan memperbarui bagian itu ke nilai baru.
Jadi CompetitionResults harus memiliki beberapa bidang "lama" dan "baru" - oldEmail, newEmail, oldPhone, newPhone, dll. Dengan begitu Anda dapat membentuk kunci komposit, di Pesaing, dari Nama Pesaing, Email, dan Telepon.
Kemudian ketika Anda memiliki beberapa hasil kompetisi, Anda dapat memotong dan memuat kembali tabel CompetitionResults Anda dari lembar excel Anda atau apa pun yang Anda miliki, dan menjalankan satu, penyisipan efisien untuk memasukkan semua pesaing baru ke dalam tabel Pesaing, dan pembaruan tunggal, efisien untuk memperbarui semua informasi tentang pesaing yang ada dari Hasil Kompetisi. Dan Anda dapat melakukan satu penyisipan untuk menyisipkan baris baru ke dalam tabel CompetitionCompetitors. Hal-hal ini dapat dilakukan dalam prosedur tersimpan ProcessCompetitionResults, yang dapat dieksekusi setelah memuat tabel CompetitionResults.
Itu semacam deskripsi yang belum sempurna dari apa yang saya lihat dilakukan berulang-ulang di dunia nyata dengan Aplikasi Oracle, SAP, PeopleSoft, dan daftar cucian suite perangkat lunak perusahaan lainnya.
Satu komentar terakhir yang saya buat adalah komentar yang pernah saya buat di SO: Jika Anda membuat kunci asing yang memastikan bahwa ada Pesaing di tabel Pesaing sebelum Anda dapat menambahkan baris dengan Pesaing di dalamnya ke Pesaing Pesaing, pastikan bahwa kunci asing diatur untuk membuat pembaruan dan menghapus . Dengan begitu jika Anda perlu menghapus pesaing, Anda bisa melakukannya dan semua baris yang terkait dengan pesaing itu akan dihapus secara otomatis. Jika tidak, secara default, kunci asing akan meminta Anda untuk menghapus semua baris terkait dari CompetCompetitors sebelum itu akan membiarkan Anda menghapus Pesaing.
(Beberapa orang berpikir kunci asing non-kaskade adalah tindakan pencegahan keamanan yang baik, tetapi pengalaman saya adalah bahwa mereka hanya rasa sakit yang luar biasa di pantat yang lebih sering daripada tidak hanya akibat dari pengawasan dan mereka membuat banyak pekerjaan. untuk DBA. Berurusan dengan orang-orang yang secara tidak sengaja menghapus hal-hal adalah mengapa Anda memiliki hal-hal seperti dialog "apakah Anda yakin" dan berbagai jenis cadangan reguler dan sumber data yang berlebihan. Jauh, jauh lebih umum untuk benar-benar ingin menghapus pesaing, yang datanya semua misalnya kacau, daripada menghapus secara tidak sengaja dan kemudian pergi "Oh tidak! Saya tidak bermaksud melakukan itu! Dan sekarang saya tidak memiliki hasil kompetisi mereka! Aaaahh!" Yang terakhir ini tentu cukup umum, jadi , Anda harus siap untuk itu, tetapi yang pertama jauh lebih umum,jadi cara termudah dan terbaik untuk mempersiapkan yang pertama, imo, adalah dengan hanya membuat pembaruan dan menghapus kunci asing.)
NVARCHAR(64)
kolom kunci utama Anda (dan dengan demikian: pengelompokan) !! Pertama-tama - ini adalah kunci yang sangat luas - hingga 128 byte; dan kedua itu ukuran variabel - lagi: tidak optimal ... Ini tentang pilihan terburuk yang dapat Anda miliki - kinerja Anda akan sangat buruk, dan fragmentasi tabel dan indeks akan berada di 99,9% setiap saat .....