Turnuva veritabanı tasarlamanın en iyi yolu


13

Yaklaşan Euro 2012 futbol turnuvasının tüm maçlarına bahis oynamak için bir web sayfası oluşturuyorum. Nakavt aşaması için hangi yaklaşımın uygulanacağına karar vermek için biraz yardıma ihtiyacınız var.

Aşağıda, tüm "bilinen" grup aşaması maçlarının sonuçlarını saklama konusunda oldukça memnun olduğum bir maket oluşturdum. Bu tasarım, bir kullanıcının doğru bir bahis koyup koymadığını kontrol etmeyi çok kolaylaştırır.

Ancak çeyrek ve yarı finalleri depolamanın en iyi yolu nedir? Bu maçlar grup aşamasındaki sonuca bağlıdır.

Düşündüğüm bir yaklaşım, matchestabloya TÜM eşleşmeler eklemekti , ancak nakavt aşamasındaki maçlar için ev / deplasman takımlarına farklı değişkenler veya tanımlayıcılar atamaktı. Ve sonra bu tanımlayıcıların ekiplerle eşleştirildiği başka bir tablo var ...

Temel veritabanı tasarımı


MySQL kullanmaya mı karar verdiniz yoksa alternatiflere açık mısınız?
Jack diyor ki topanswers.xyz

Oldukça yerleşmiş .. Bilmem gereken MySQL ile herhangi bir avantaj / dezavantaj var mı?
hampusohlsson

Çek kısıtlamaları uygulanmıyor. DRI ile kısıtlamaları zorlamak için genellikle daha az seçenek - ancak bunun sizin için önemli olup olmadığı çok fazla uygulamanıza bağlıdır. Daha fazla görüş istiyorsanız mutlu sohbet :)
Jack diyor denemek topanswers.xyz

Teşekkürler, ama yine de çok aşina olmadığım için kısıtlamaları kullanacağımı sanmıyorum. DB'ye gönderilmeden önce uygulamamdaki tüm verileri doğrular, basit tutar
hampusohlsson

İyi iyi. Tabii ki DB daha basit ama bu tamamen başka bir konuşma ;)
Jack diyor denemek topanswers.xyz

Yanıtlar:


3

Modelin içindeki önceden belirlenmiş tüm bilgileri düzeltmeye çalışarak işe başladım

  • tarih / mekânları
  • yapı (yani grup / nakavt aşamaları)
  • kurallar (yani puanlama, tie-break kuralları)

Bu bilgilerin bazıları tablolardaki veriler, bazıları ise görünümlerde kodlanmış mantık olacaktır.

Belki böyle bir şey:

  • ekip (team_id, group_code enum ('A', 'B', 'C', 'D'), ad)
  • maç (match_id, kickoff_at)
  • group_match (match_id, team_id_home, team_id_away, grup_kodu)
  • knockout_match (match_id, knockout_code enum ('Q1', 'Q2', 'Q3', 'Q4', 'S1', 'S2', 'F')
  • sonuç (match_id, score_home, score_away)

İlk çeyrekte takımların oynadığı bu tür bilgilerin asla doğrudan saklanması gerekmez, çünkü grup aşaması sonuçlarından hesaplanabilir. Sadece turnuva gelişmeler sokulmuş olarak değişiklikler yapmak için resultmasaya.


3

Takım kimliğini kullanmanın doğru yol olduğunu düşünüyorum. Tüm final turları için bir başka soyutlama düzeyi, eşleşme tablosunu verilerle önceden yüklemek dışında çok fazla fayda sağlamak için gereksiz karmaşıklık ekler.

Veri yapısı bunu desteklemek için oldukça sağlam görünüyor. İlk maç sonuçları geldikten sonra çeyrek ve yarı finallerin maç tablosuna eklenmesi gerekir. Eğer maçlar rastgele atanırsa, bu manuel bir işlemdir, ancak belirli bir sıradaysa ...

   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

... bu muhtemelen bir sorgu ile yapılabilir. Yine, takım sayısına bağlı olarak sorgunun karmaşıklığı çabaya değmeyebilir


1

Tüm eşleşmeleri "eşleşmeler" tablosunda saklamak iyi bir fikirdir. Ancak ben daha sonra verimli bir şekilde bellekte tablo sorgulamak için bir ikili ağaç oluşturmak için ona bir "alan" sıralama bir alan eklemek istiyorum. Bu klasik bir sıralama algoritması sorunu ve daha fazla bilgi için google için gri kod turnuvası yapabilir veya yığın akışı geçmişime bakabilirsiniz. Temelde bir turnuva ikili bir ağaçtır. Gri kodlar hakkında iyi bir makale: http://villemin.gerard.free.fr/Wwwgvmm/Numerati/CodeGray.htm . Ne yazık ki fransız. Sıralamadan ikili bir ağacın nasıl oluşturulacağı aşağıda açıklanmıştır: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229068 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.