Nihayetinde, kullanım ve mimarlık geliyor.
Mimari
Sistem "herhangi bir sporu" ele alıyor mu? Mimari astronot şapkanızı takmanız ve bugün bile var olmayabilecek gelecekteki spor türlerini idare edebilecek jenerik bir sistem kurmanız fikri?
Öyleyse, dinamik olarak adlandırılmış tablolara sahip olmak büyük bir acıdır, bu nedenle gerekirse n sporu destekleyen bir şemaya sahip olmak mantıklı olacaktır.
Bununla birlikte, bu yaklaşıma karşı çok güçlü bir önyargım var: bu neredeyse her zaman daha fazla iştir ve daha kötü sonuçlara yol açar. Her bir spor için ayrı bir kullanıcı arayüzü, şema vb. Yapmak, sonuçta daha iyi bir kullanıcı deneyimine ve kodun sürdürülmesine yol açacaktır, bu da yüzeysel bir miktar çoğaltma anlamına gelse de (bunun nasıl önleneceği / en aza indirileceği ayrı bir sorudur).
Birden fazla spor yapan oyuncuları nasıl ele alırsınız? İki giriş alıyorlar mı (örneğin, farklı insanlar gibi davranıyorsunuz) veya onlarla belirli bir şey yapmaya mı çalışıyorsunuz?
kullanım
Bu nedenle, dinamik olarak spor yapmadığınızı varsayalım (örneğin, birisi yeni bir spor eklemek istiyorsa, onu eklemek için geliştirme çabası gerektirir).
Her seferinde birden fazla spor dalında oyuncuları (veya bahsettiğiniz herhangi bir nesneyi) sergilediğiniz bir zaman oldu mu?
Bunu, oyuncuya veya takım adına göre (spor ne olursa olsun) arayabileceğiniz bir arama işlevi için görebiliyordum, ancak bunun ötesinde birçok kullanım durumu hayal edemiyorum.
Bunu asla yapmanız gerekmiyorsa, yaklaşımınız gayet iyi. Burada okumayı bırakabilirsiniz.
Alternatif Şemalar
Görüntüleme
Ben KISS hayranıyım. 15 yılı aşkın yazılım geliştirmede, "işe yarayan en basit şeyi inşa et" felsefesine geri dönmeye devam ediyorum.
Bu yüzden ilk tepkim, bir çapraz spor arama işlevinin gerçekten tek kullanım durumu olduğunu varsayarsak, görünümler oluşturmaktır:
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 ....
Tabii ki, yeni bir spor eklerseniz, görünüme eklemeniz gerekir. Diğer yaygın bilgileri dahil etmek de yararlı olabilir, ancak bu gerçekten neyin gösterilmesi gerektiğine bağlıdır.
Arama kodu (yanında belki nasıl bağlantıya bilerek çok veya herhangi bir özel koduna sahip gerekmez yüzden, Görünüm tanımı tüm spor özgü şeyler tutmaya çalışacaktı /nhl/players/player-name
vs /nfl/...
uygulama bunu yapar ya da bununla birlikte).
Tablo Devralma
Tablo kalıtımı işe yarayabilir, ancak oldukça karmaşıktır. Bununla ilgili tonlarca deneyimim yok ve aslında, her değerlendirmede yer aldığımda, daha basit bir şey yaptığımızı düşünüyorum (burada önerdiğim gibi).
Kişisel olarak, bunun neden yararlı olacağını henüz bulmadım, ancak belki de karmaşıklığı haklı çıkaran ikna edici bir kullanım durumu var (bilmiyorum) (örneğin, Tablo mirası kullanım durumunu diğer çözümlerden daha iyi çözüyor) .
Spora özgü özellikler için ayrı tablolar
players
Tüm sporların tüm oyuncuları için ortak özelliklere sahip tek bir masa ve ardından nhl_players_details
bir playerId ve oyuncu hakkında ek bilgi içeren sütunlar içeren başka bir tablo kümesi yapabilirsiniz . Bir ton ortak özellik varsa veya "tüm sporlardan tüm oyuncular" ın birçok kullanımı varsa, bu mantıklı olabilir.
Spora özgü özellikler için anahtar / değer çiftleri
Tamamen alternatif bir yaklaşım: Bir var players
ve sonra (ortak isim gibi özellikleri ile yine) tablo player_data
vardır masaya PlayerId
, Sport
, Attribute
, Value
. Girilen özellik adları spora özel olacaktır. Bu, şemayı değiştirmeden temel olarak yeni özellikler eklemenize izin verir (kodunuzun elbette bunları yüklemeyi / görüntülemeyi bilmesi gerekir). Dezavantajı bazı bütünlüğü kaybetmektir: değer genellikle bir dize alanı olurdu, bu nedenle uygulama kodunuzun esnek olması ve dizeyi value
belirli bir veri türüne (tamsayı gibi) dönüştüren olası hataları ele alması gerekir .
Bu konsept elbette Takımlar, Oyunlar vb. İçin geçerli olabilir.