Cara terbaik untuk merancang basis data turnamen

13

Saya membuat halaman web untuk memasang taruhan pada semua pertandingan turnamen sepakbola Euro 2012 mendatang. Butuh bantuan untuk memutuskan pendekatan apa yang harus diambil untuk fase sistem gugur.

Saya telah membuat mockup di bawah ini, yang saya cukup puas ketika harus menyimpan hasil dari semua pertandingan penyisihan grup "yang diketahui". Desain ini membuatnya sangat mudah untuk memeriksa apakah pengguna telah memasang taruhan yang benar atau tidak.

Tapi apa cara terbaik untuk menyimpan perempat final dan semi final? Pertandingan tersebut tergantung pada hasil di babak grup.

Satu pendekatan yang saya pikirkan adalah menambahkan SEMUA pertandingan ke matchestabel, tetapi menetapkan variabel atau pengidentifikasi yang berbeda untuk tim tuan rumah / tandang untuk pertandingan dalam fase sistem gugur. Dan kemudian memiliki meja lain dengan pengidentifikasi yang dipetakan ke tim ... Ini bisa bekerja, tetapi rasanya tidak benar.

Desain basis data dasar

hampusohlsson
sumber
Apakah Anda setuju menggunakan MySQL atau terbuka untuk alternatif?
Jack bilang coba topanswers.xyz
Cukup banyak diselesaikan .. Apakah ada kelebihan / kekurangan dengan MySQL yang harus saya ketahui?
hampusohlsson
Batasan pemeriksaan tidak diberlakukan. Umumnya lebih sedikit pilihan untuk menegakkan batasan dengan DRI - tetapi apakah itu penting bagi Anda sangat tergantung pada aplikasi Anda. Senang mengobrol jika Anda ingin pendapat lain :)
Jack mengatakan coba topanswers.xyz
Terima kasih, tapi saya pikir saya tidak akan menggunakan kendala karena saya tidak terlalu terbiasa dengannya. Akan memvalidasi semua data dalam aplikasi saya sebelum dikirim ke DB, menjaganya tetap sederhana
hampusohlsson
Bagus. Lebih sederhana dalam DB tentu saja tetapi itu adalah percakapan lainnya ;)
Jack mengatakan coba topanswers.xyz

Jawaban:

3

Saya akan memulai dengan mencoba memperbaiki semua informasi yang telah ditentukan dalam model itu sendiri termasuk

  • tanggal / tempat
  • struktur (yaitu babak grup / sistem gugur)
  • aturan (yaitu skor poin, aturan tie-break)

Beberapa informasi ini akan berupa data dalam tabel, beberapa akan dikodifikasikan logika dalam pandangan.

Sesuatu seperti ini mungkin:

  • team (team_id, group_code enum ('A', 'B', 'C', 'D'), nama)
  • match (match_id, kickoff_at)
  • group_match (match_id, team_id_home, team_id_away, group_code)
  • knockout_match (match_id, knockout_code enum ('Q1', 'Q2', 'Q3', 'Q4', 'S1', 'S2', 'S2', 'F')
  • hasil (match_id, score_home, score_away)

Informasi yang dimainkan oleh tim di Q1 tidak perlu disimpan secara langsung karena dapat dihitung dari hasil penyisihan grup. Satu- satunya perubahan yang dibuat saat turnamen berlangsung adalah memasukkan ke dalam resulttabel.

Jack berkata coba topanswers.xyz
sumber
3

Saya pikir menggunakan ID tim adalah cara yang tepat. Tingkat abstraksi lain untuk semua putaran final hanya menambah kompleksitas yang tidak perlu untuk tidak banyak manfaat selain dari pra-memuat tabel pertandingan dengan data.

Struktur data terlihat cukup solid untuk mendukung ini. Perempat final dan semi final perlu ditambahkan ke tabel pertandingan setelah hasil pertandingan awal masuk. Jika pertandingan ditetapkan secara acak maka ini adalah operasi manual, namun, jika mereka berada dalam urutan tertentu ...

   A
match 1 -----+
   B         A
          match 5 -----+
   C         C         |
match 2 -----+         |
   D                   A
                    match 7
   E                   F
match 3 -----+         |
   F         F         |
          match 6 -----+
   G         G
match 4 -----+
   H

... maka ini mungkin dapat dilakukan dengan kueri. Sekali lagi, kompleksitas kueri mungkin tidak sepadan dengan usaha tergantung pada jumlah tim

Tevo D
sumber
1

Merupakan ide bagus untuk menyimpan semua kecocokan di tabel "kecocokan". Namun saya akan menambahkan bidang "peringkat" tambahan untuk itu, karena nanti Anda membutuhkannya untuk membangun pohon biner untuk secara efisien query tabel dalam memori. Ini masalah algoritma peringkat klasik dan Anda dapat google untuk turnamen kode abu-abu untuk informasi lebih lanjut atau lihat di riwayat stackoverflow saya. Pada dasarnya turnamen adalah pohon biner. Berikut ini adalah artikel bagus tentang kode abu-abu: http://villemin.gerard.free.fr/Wwwgvmm/Numerati/CodeGray.htm . Sayangnya ini bahasa perancis. Berikut adalah cara membuat pohon biner dari peringkat: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229068 .

Gigameg
sumber