sql >> Database >  >> RDS >> Mysql

Welk kolomtype moet worden gebruikt om geserialiseerde gegevens op te slaan in een mysql-database?

Om te antwoorden:het lijkt erop dat tekst in veel DBMS verouderd is, dus gebruik een blob of een varchar met een hoge limiet (en met blob krijg je geen coderingsproblemen, wat een groot gedoe is met varchar en tekst) .

Ook zoals aangegeven in deze thread op de MySQL-forums , harde schijven zijn goedkoper dan software, dus je kunt beter eerst je software ontwerpen en laten werken, en pas dan als ruimte een probleem wordt, wil je dat aspect misschien optimaliseren. Probeer dus niet te vroeg de grootte van uw kolom te overoptimaliseren, maar stel de grootte eerst groter in (plus dit voorkomt beveiligingsproblemen).

Over de verschillende opmerkingen:Te veel SQL-fanatisme hier. Ondanks dat ik dol ben op SQL en relationele modellen, hebben ze ook hun valkuilen.

Het opslaan van geserialiseerde gegevens in de database zoals het is (zoals het opslaan van JSON- of XML-geformatteerde gegevens) heeft een aantal voordelen:

  • U kunt een flexibeler formaat voor uw gegevens hebben:velden ter plekke toevoegen en verwijderen, de specificatie van de velden wijzigen, enz...
  • Minder impedantie-mismatch met het objectmodel:u slaat de gegevens op en haalt ze op zoals ze in uw programma staan, vergeleken met het ophalen van de gegevens en deze vervolgens te verwerken en te converteren tussen de structuren van uw programma-objecten en de structuren van uw relationele database .

En er zijn nog veel meer andere voordelen, dus geen fanboyisme:relationele databases zijn een geweldige tool, maar laten we de andere tools die we kunnen krijgen niet voor de gek houden. Meer tools, hoe beter.

Wat betreft een concreet gebruiksvoorbeeld, ik heb de neiging om een ​​JSON-veld in mijn database toe te voegen om extra parameters van een record op te slaan waarbij de kolommen (eigenschappen) van de JSON-gegevens nooit afzonderlijk worden SELECTEERD, maar alleen worden gebruikt wanneer het juiste record is al geselecteerd. In dit geval kan ik mijn records nog steeds onderscheiden met de relationele kolommen, en wanneer het juiste record is geselecteerd, kan ik de extra parameters gewoon gebruiken voor welk doel dan ook.

Dus mijn advies om het beste van twee werelden te behouden (snelheid, serialiseerbaarheid en structurele flexibiliteit), gebruik gewoon een paar standaard relationele kolommen om als unieke sleutels te dienen om onderscheid te maken tussen uw rijen, en gebruik vervolgens een blob/varchar-kolom waar uw geserialiseerde gegevens worden ingevoegd. Gewoonlijk zijn slechts twee/drie kolommen vereist voor een unieke sleutel, dus dit zal geen grote overhead zijn.

Mogelijk bent u ook geïnteresseerd in PostgreSQL, dat nu een JSON-gegevenstype heeft, en het PostSQL-project om JSON-velden direct te verwerken als relationele kolommen.



  1. MySQL-volgorde op beste match

  2. Wat is het PostgreSQL-equivalent voor ISNULL()

  3. Hoe mysql willekeurig geheel getal bereik te krijgen?

  4. MySQL onverwachte resultaten:IN-clausule (getal, 'string') op een varchar-kolom