sql >> Database >  >> RDS >> Mysql

Gegevensstructuur voor verschillende soorten toernooien/competities (competitie, ladder, enkele/dubbele eliminatie enz.)

Er zijn hier verschillende vragen/problemen, dus ik zal proberen ze allemaal te beantwoorden.

Alle toernooi-interacties moeten realtime/weerspiegeld zijn voor veel gebruikers.

Voor klein tot middelgroot verkeer op uw website is dit misschien geen probleem. Voor zwaarder verkeer zal dit al snel een groot probleem worden.

Overweeg als voorbeeld hoe vaak u de database wilt pollen met uw AJAX-aanroepen. Elke seconde? Dus als je 100 mensen hebt met een pagina open, heb je 100 database-oproepen per seconde? Je zult merken dat dit je database snel zal vernietigen.

Hoewel dit een beetje off-topic is, raad ik je ten zeerste aan om van tevoren te onderzoeken hoe je toernooiresultaten kunt cachen. Je kunt de statistieken enz. cachen en ze ofwel laten verlopen ofwel proactief laten verlopen, maar besteed zeker wat tijd aan het onderzoeken ervan.

Realtime statistieken/resultaten

Houd er rekening mee dat joins tijd kosten in relationele databases. Als je je toernooistructuur sterk normaliseert, kan het lastig zijn om statistieken te krijgen. Het moeilijkste deel van het systeem om efficiënt te maken, zijn de aggregaten en statistieken van elk toernooi.

Houd bij het ontwerpen van uw database/tabellen/weergaven/opgeslagen procedures rekening met het einddoel:snel statistieken verkrijgen. Dit kan betekenen niet de gegevens te veel normaliseren (om te veel joins te voorkomen). Het kan ook betekenen dat u heel goed op uw gegevenstypen moet letten, bijvoorbeeld met bits/shorts/etc. in plaats van gehele getallen.

Hoe de verschillende soorten toernooien te modelleren

Ik ben niet bekend met toernooimodellen, maar ik heb wel specifiek advies over hoe te modelleren. =)

Enkele vragen die u uzelf moet stellen:

  1. Hebben alle toernooien gemeenschappelijke velden? Met andere woorden, voor een round robin-toernooi slaan we 10 velden op. Voor een enkelvoudig eliminatietoernooi slaan we 11 velden op. Als ze dezelfde 10 velden delen, raad ik aan om alle toernooitypes in één tabel te plaatsen en vervolgens een toernooitype-veld te gebruiken om het type toernooi voor je toepassing te bepalen.

  2. Hebben alle toernooien geen gemeenschappelijke velden? Maak ze aparte tafels - één per toernooitype. U kunt één tabel maken voor gedeelde gegevens, maar dan verschillende tabellen voor specifieke informatie.

  3. Zullen toernooivelden na verloop van tijd uit elkaar groeien ? Na verloop van tijd wil je velden toevoegen aan toernooitypes. Als je voorspelt dat de toernooien in de loop van de tijd heel uniek en heel specifiek zullen worden, maak ze dan apart. Anders krijg je veel velden met tonnen NULL-waarden erin.

  4. Heeft u een NoSQL-oplossing overwogen ? Het leuke van een NoSQL-winkel is dat het de gegevens denormaliseert, zodat je geen joins hebt. U kunt ook heterogene (verschillende soorten gegevens) in dezelfde "tabel" of container hebben. Gewoon iets om over na te denken, want het kan uw leven aanzienlijk gemakkelijker maken. Bekijk MongoDB als voorbeeld.




  1. PHP PDO SQL retourneert slechts één rij met gegevens in plaats van alle rijen

  2. INSERT INTO...SELECT voor alle MySQL-kolommen

  3. Python, MySQL _mysql_exceptions.ProgrammingError:(1064, 'U heeft een fout in uw SQL-syntaxis

  4. Alleen PHP PDO laatste waarde van array wordt ingevoegd met bindValue &bindParam