tabel tunggal dengan kolom ekstra vs beberapa tabel yang menduplikasi skema

13

Saya sedang mengerjakan sebuah proyek di mana pada titik tertentu, saya perlu membuat keputusan tentang apakah atau tidak, dalam database, saya harus memiliki satu tabel dengan beberapa kolom yang tidak setiap catatan menggunakan, atau beberapa tabel dengan skema duplikat.

Saya membuat aplikasi informasi Olahraga yang dapat menangani banyak olahraga. Kami dapat menangani NBA, NHL, MLB, NFL misalnya. Setiap olahraga memiliki konsep yang sangat mirip - Tim, Jadwal, Cedera, Info pemain ..

Sumber data kami tentu saja tidak memberi kami setiap bagian data dalam skema yang sama. Setiap olahraga memiliki Skema berbeda yang kami terima datanya dari vendor kami.

Karena tidak ada cukup waktu (permintaan klien) untuk melakukan analisis awal dari umpan data untuk menentukan kesamaan, saya lindung nilai taruhan saya dan mengambil 'taruhan aman' dan membuat masing-masing tabel terpisah untuk setiap olahraga daripada satu set tabel yang semuanya olahraga yang digunakan.

Hasilnya adalah skema duplikat di beberapa tabel, dan jadi duplikat antarmuka ke database (misalnya procs tersimpan) juga. Saya memiliki sesuatu seperti NBA_Game, NFL_Game, NBA_Team, NFL_Team, dll. Setiap tabel mungkin memiliki beberapa properti yang yang lainnya tidak, dan beberapa yang dibagi. itu berlangsung untuk mengatakan 5-10 tabel di 4 atau 5 olahraga. Saya masih tidak yakin apakah ini sepenuhnya merupakan hal yang buruk - alternatifnya, memiliki satu set tabel yang memiliki properti di atasnya yang tidak semua olahraga akan gunakan, mungkin memiliki sendiri juga berat.

Adakah orang yang telah mengalami kesulitan dalam desain semacam ini dan dapat membagikan pengalaman mereka di sini? Hal-hal yang mungkin membantu saya untuk tahu sekarang alih-alih belajar dengan cara yang sulit di jalan? Sudahkah Anda melakukannya dengan cara lain, memiliki satu meja besar / set tabel, dengan kolom yang tidak setiap catatan akan gunakan? Perangkap apa yang Anda temui dalam melakukan itu?

Apakah ada beberapa alternatif seperti pewarisan tabel yang telah Anda gunakan di masa lalu yang berfungsi lebih baik?

Terima kasih

dferraro
sumber

Jawaban:

12

Pada akhirnya, ia menggunakan dan arsitektur.

Arsitektur

Apakah sistem menangani "olahraga apa pun"? Apakah gagasan bahwa Anda mengenakan topi astronot arsitektur Anda, dan membangun sistem generik yang dapat menangani semua jenis olahraga masa depan yang bahkan mungkin tidak ada saat ini?

Jika demikian, jelas memiliki tabel yang dinamai dinamis adalah rasa sakit yang sangat besar, jadi masuk akal untuk memiliki skema yang mendukung olahraga, jika diperlukan.

Yang mengatakan, saya memiliki bias yang sangat kuat terhadap pendekatan ini: ini hampir selalu lebih banyak bekerja dan mengarah pada hasil yang lebih buruk. Membuat UI, skema, dll yang terpisah, untuk setiap olahraga pada akhirnya akan mengarah pada pengalaman pengguna yang lebih baik dan lebih mudah untuk mempertahankan kode, bahkan jika itu berarti sejumlah duplikasi dangkal (bagaimana menghindari / meminimalkan ini adalah pertanyaan terpisah).

Bagaimana Anda menangani pemain yang memainkan banyak olahraga? Apakah mereka mendapat dua entri (mis. Anda memperlakukan sebagai orang yang berbeda) atau Anda mencoba melakukan sesuatu yang spesifik dengannya?

Menggunakan

Jadi anggaplah Anda tidak melakukan olahraga secara dinamis (misalnya, jika seseorang ingin menambahkan olahraga baru, itu memerlukan upaya pengembangan untuk menambahkannya).

Apakah pernah ada waktu di mana Anda menampilkan pemain (atau objek lain yang Anda sebutkan) dari lebih dari satu olahraga pada suatu waktu?

Saya bisa melihat ini untuk fungsi pencarian, di mana Anda bisa mencari berdasarkan nama pemain atau tim (terlepas dari olahraga), tetapi di luar itu saya tidak bisa membayangkan banyak kasus penggunaan.

Jika Anda tidak perlu melakukan ini, maka pendekatan Anda baik-baik saja. Anda bisa berhenti membaca di sini.

Skema Alternatif

Tampilan

Saya penggemar CIUMAN. Dalam 15+ tahun pengembangan perangkat lunak, saya terus kembali ke filosofi "membangun hal paling sederhana yang berhasil".

Jadi reaksi awal saya, dengan asumsi fungsi pencarian lintas-olahraga adalah satu-satunya kasus penggunaan, adalah membuat tampilan:

SELECT PlayerName, 'NFL' as [Sport], TeamName FROM NFL_Players JOIN NFL_Teams ... 
UNION  
SELECT PlayerName, 'NHL' as [Sport], TeamName FROM NHL_Players JOIN NHL_Teams ... 
UNION ....

Tentu saja, jika Anda menambahkan olahraga baru, Anda harus menambah tampilan. Mungkin juga berguna untuk memasukkan informasi umum lainnya tetapi sebenarnya itu tergantung pada apa yang perlu ditampilkan.

Saya akan mencoba untuk menyimpan semua hal khusus olahraga dalam definisi Lihat, jadi kode pencarian tidak perlu memiliki banyak atau kode spesifik apa pun (selain mungkin mengetahui cara menautkan ke /nhl/players/player-namevs /nfl/...atau bagaimanapun aplikasi Anda melakukannya).

Warisan Tabel

Warisan tabel bisa berfungsi, tetapi cukup rumit. Saya tidak punya banyak pengalaman dengannya, dan pada kenyataannya, saya pikir setiap kali saya terlibat dalam mengevaluasinya, kami akhirnya melakukan sesuatu yang lebih sederhana (seperti yang saya sarankan di sini).

Jadi secara pribadi, saya belum menemukan mengapa ini akan berguna, tetapi mungkin ada kasus penggunaan yang meyakinkan (yang saya tidak tahu) yang membenarkan kerumitan (misalnya, warisan Tabel memecahkan kasus penggunaan lebih baik daripada solusi lain) .

Tabel terpisah untuk atribut khusus olahraga

Anda bisa melakukan satu playerstabel yang memiliki atribut umum untuk semua pemain dari semua olahraga, dan kemudian satu set tabel seperti nhl_players_detailsitu yang berisi ID player dan kolom dengan info tambahan tentang pemain. Jika ada banyak atribut umum, atau Anda memiliki banyak kegunaan "semua pemain dari semua olahraga" maka ini mungkin masuk akal.

Pasangan nilai kunci untuk atribut khusus olahraga

Pendekatan yang sama sekali alternatif: memiliki playersmeja (sekali lagi, dengan atribut umum seperti nama) dan kemudian player_datameja yang memiliki PlayerId, Sport, Attribute, Value. Nama atribut yang dimasukkan akan spesifik untuk olahraga. Ini memungkinkan Anda untuk secara esensial menambahkan atribut baru tanpa memodifikasi skema (kode Anda masih harus tahu untuk memuat / menampilkannya tentu saja). Kekurangannya adalah Anda kehilangan integritas: nilai biasanya berupa bidang string, jadi kode aplikasi Anda harus tangguh dan menangani potensi kegagalan mengonversi string valueke tipe data tertentu (seperti integer).

Konsep ini tentu saja dapat berlaku untuk Tim, Permainan, dll.

gregmac
sumber
Mencari solusi untuk proyek lawas akan banyak jenis dan tabel otentik, menyebutkan pandangan di sini, yang saya lupa tentang, telah benar-benar membantu menawarkan solusi lain yang mungkin untuk penelitian saya. Terima kasih.
FullStackFool
5

Anda sedang berbicara tentang normalisasi Database . Anda mungkin lega mengetahui bahwa tidak ada yang namanya model data sempurna, dan lebih banyak normalisasi tidak selalu lebih baik. Normalisasi dapat membebankan biaya dalam hal kejelasan model data dan kinerja database. Oleh karena itu, model terbaik untuk memilih akan tergantung pada persyaratan penggunaan Anda.

Di permukaan, contoh-contoh Anda tampak cukup mirip dalam konsep (X_Game vs Y_Game dan X_Team vs Y_Team) bahwa overhead tambahan dari beberapa kolom tampaknya tidak masuk akal. Yang mengatakan, jika setiap olahraga akan menambah beberapa lusin kolom tambahan ke meja, itu memang akan sulit.

Dalam hal itu, Anda mungkin ingin mempertimbangkan model hibrida, di mana data umum disimpan di tabel pusat, tetapi data khusus olahraga disimpan dalam struktur data yang ditautkan. Sesuatu seperti:

table Game {
    gameId int,
    teamId1 int fk,
    teamId2 int fk
}

table HockeyGame {
    gameId int fk,
    penaltyMinutes int
}

table BasketballGame {
    gameId int fk,
    freeThrows int
}
Midnotion
sumber
Inilah yang akan saya usulkan, plus mungkin sebuah kolom di tabel Game yang menunjukkan jenis game. Saya menyadari bahwa ini dapat disimpulkan dengan bergabung di tabel lain, tetapi jika jumlah jenis permainan bertambah, itu mulai membosankan.
Rory Hunter
Tentu saja - ini hanya model kerangka untuk menggambarkan hubungan inti dan beberapa contoh dari apa yang mungkin menjadi data umum vs data olahraga spesifik.
Midnotion