sql >> Database >  >> RDS >> Mysql

Is er enig voordeel/nadeel van het opslaan van veldwaarde als een JSON-array in plaats van het creëren van een nieuwe tabel en een-op-veel-relatie?

In mijn ervaring hangt dat vrij veel af van de gegevens die worden opgeslagen. Beide manieren hebben voor- en nadelen. Als het een MMORPG is webgame zeg dan dat je een pc hebt die een riem heeft. En de pc kan drankjes in die riem doen voor snelle toegang tijdens een gevecht. Dus we willen de id's van de drankjes bewaren, die in de riem van het personage zijn opgeslagen.

Het meest voorkomende verzoek zou zijn "haal alle drankjes die het personage X heeft". En dat zou in beide gevallen behoorlijk snel gaan.

De voordelen van het opslaan van deze drankjes-id's als een aparte tabel:

  • Je kunt zoeken naar een specifiek drankje-ID en het is erg snel. In-game-voorbeeld:beheerders hebben een drankje uit het spel verwijderd en daarom moet je de riemen van iedereen bijwerken
  • Je kunt mooie statistieken krijgen. In-game-voorbeeld:zoek naar het meest gebruikte drankje onder alle spelers
  • De database handhaaft de gegevensintegriteit. In-game-voorbeeld:je zult nooit een situatie tegenkomen waarin je het drankje hebt gebruikt en het spel zegt "Oeps, een drankje met dat id bestaat niet"
  • Het is goed voor de consistentie. In-game-voorbeeld:je nam een ​​drankje van de riem en stopte het in de rugzak. Het spel kan het implementeren door een transactie aan te roepen met twee eenvoudige duidelijke SQL-instructies.
  • Je kunt JOIN's doen. In-game-voorbeeld:we hebben een lijst met drankjes in de riem nodig, samen met hun namen, gewichten en afbeeldingen die in de aparte tabel zijn opgeslagen.
  • Je kunt een enkel item bijwerken, zonder dat je de hele riem hoeft te updaten. In-game-forced-voorbeeld:je hebt een miljoen drankjes in je riem en je hebt er een gedronken.

De voordelen van opslaan als json:

  • Als het een browserspel is dat javascript aan de clientzijde gebruikt, dan krijg je het Belt json-object met één eenvoudig verzoek in plaats van Select-query uit te voeren en vervolgens te converteren naar json
  • Het is veel gemakkelijker om de volgorde van items te behouden, omdat json-arrays al zijn besteld. Met de tabelbenadering zou u een extra kolom met de naam "bestelling" nodig hebben en deze elke keer bijwerken en controleren of twee items niet dezelfde bestelling hebben enz.
  • Je kunt een heleboel herschikkingen doen in de Belt aan de clientzijde en vervolgens op "Toepassen" klikken - boem, met één vraag kun je de hele riem bijwerken. Terwijl je met de tabelbenadering daarvoor minstens twee queries nodig hebt (DELETE + INSERT)
  • Bovendien hebben populaire DBMS plug-ins die json-functies in de database ondersteunen

Kortom:die zijn niet groot voordelen en niet kritiek problemen. Ze zijn allemaal oplosbaar en met een goed ontwerp van de applicatie zullen beide oplossingen goed werken. Voordat u beslist hoe u de gegevens gaat opslaan, moet u zich afvragen wat de meest voorkomende gebruiksscenario's zijn voor deze gegevens en daarna de oplossing kiezen.



  1. Een left join uitvoeren in een veel-op-veel-tabel met voorwaarden

  2. MySQL - Snelste manier om te controleren of gegevens in de InnoDB-tabel zijn gewijzigd

  3. Oracle DB Server + APEX + ORDS + JasperReports from scratch (Deel 1)

  4. Monitor SQL Database via SP_WhoIsActive of FogLight | Problemen met SQL Server-prestaties oplossen -1