sql >> Database >  >> RDS >> Database

Hoe u de juiste gegevenstypen selecteert

Aangezien de hoeveelheid gegevens van een typisch bedrijf exponentieel is gegroeid, is het nog belangrijker geworden om de gegevensopslag te optimaliseren. De grootte van uw gegevens heeft niet alleen invloed op de opslaggrootte en -kosten, maar ook op de queryprestaties. Een belangrijke factor bij het bepalen van de grootte van uw gegevens is het gegevenstype dat u selecteert. In deze zelfstudie wordt uitgelegd hoe u de juiste gegevenstypen selecteert.

Wat zijn gegevenstypen?

Gegevenstypen definieer wat voor soort en bereik van gegevens kan worden opgeslagen in een bepaald veld (of kolom).

Overweeg een verkooptabel met deze voorbeeldrecords:

Elk veld heeft zijn eigen type en bereik van waarden:

purchase_time :datum en tijd van de verkoopsale_id :gehele waarden die met één worden verhoogd voor elke nieuwe verkoopcustomer_id :gehele waarden die met één worden verhoogd voor elke nieuwe klantvaluta :tekst altijd in de 3-cijferige valutacodeamount_paid :monetaire reële numerieke waarden tussen $ 0,00 en $ 1.000,00apparaat :tekst, waarbij de waarden kunnen zijn:'desktop', 'mobile app' en 'mobile web'has_discount :boolean waarbij items TRUE kunnen zijn of FALSE notities :tekst, waarbij de invoer zo lang mag zijn als is toegestaan ​​in onze agentinvoertool (250 tekens)

Het soort gegevens (gehele getallen, tekst, reële getallen, enz...) en de mogelijke waardebereiken (0 tot 1.000; 3 willekeurige tekens; enz...) komen overeen met specifieke database gegevenstypes .

Wat zijn de mogelijke gegevenstypen?

Verschillende databases hebben verschillende datatypes beschikbaar, maar de meeste passen in deze categorieën:

Numeriek:

  • gehele getallen :voor getallen zonder breuken. Kan worden ondertekend (positieve en negatieve waarden toestaan) of niet-ondertekend (alleen positieve getallen toestaan). Vaak gebruikt voor ID-velden en tellingen van iets
  • decimaal(x,y) :voor getallen met breuken die exacte precisie vereisen. Kan worden ondertekend (positieve en negatieve waarden toestaan) of niet-ondertekend (alleen positieve getallen toestaan). Vaak gebruikt voor monetaire velden. De gebruiker specificeert het aantal toegestane significante cijfers (x) en achter de komma (y) tussen haakjes
  • drijven / verdubbelen :voor getallen met breuken die geen exacte precisie vereisen. Kan worden ondertekend (positieve en negatieve waarden toestaan) of niet-ondertekend (alleen positieve getallen toestaan). Algemeen gebruikt voor alle reële getallen behalve geldvelden

Datum/tijd:

datum :voor datumwaarden

  • tijd :voor tijdwaarden
  • tijdstempel / datumtijd :voor datum- en tijdwaarden

Tekst:

  • karakter(n) :voor tekenreeksen met een vaste lengte, waarbij de waarde tussen haakjes de vaste grootte van elk item dicteert
  • varchar(n) :voor tekenreeksen met variabele lengte, waarbij de waarde tussen haakjes de maximaal geaccepteerde grootte van elk item dicteert

Booleaans:

  • booleaans :voor booleaanse (true/false) waarden. Sommige databases (zoals MySQL) hebben geen booleaans gegevenstype en zetten in plaats daarvan booleaanse waarden om in gehele getallen (1=TRUE, 0 =FALSE)

De meeste databases bieden groottevariaties voor elk type. MySQL biedt bijvoorbeeld deze mogelijke gegevenstypen voor gehele getallen:

De juiste gegevenstypen selecteren

De basisstrategie voor het selecteren van het beste gegevenstype is om het kleinste gegevenstype te selecteren dat overeenkomt met het soort gegevens dat u heeft en dat alle haalbare waarden van uw gegevens toelaat.

Bijvoorbeeld customer_id in onze voorbeeldverkooptabel is een geheel getal dat begint met 0. Tegenwoordig heeft ons fictieve bedrijf slechts 15.000 klanten. Met behulp van de MySQL integer-gegevenstypetabel uit de vorige sectie, kunnen we in de verleiding komen om SMALLINT te selecteren unsigned als het gegevenstype, aangezien dat het kleinste gegevenstype is dat onze huidige gehele getallen van 0 tot 15.000 accepteert. We verwachten echter in de komende 6-12 maanden 100.000 klanten te hebben. Als we boven de 65.535 gaan, wordt de SMALLINT zal niet meer voldoende zijn. Een betere selectie is dus MEDIUMINT niet ondertekend, wat ons de komende jaren zou moeten dekken.

U kunt uw database gegevenstypen voor u laten selecteren bij het maken van uw tabel met voorbeeldrecords. Dit geeft u echter zelden de beste selectie van het gegevenstype. Als u bijvoorbeeld MySQL de gegevenstypen voor een verkooptabel laat selecteren met de eerder getoonde voorbeeldwaarden, geeft dit verschillende problemen.

De problemen die we tegenkomen met de gegevenstypes die MySQL automatisch heeft geselecteerd, zijn:

  1. verkeerd gegevenstype :u kunt het veld niet gebruiken zoals u zou verwachten. Bijvoorbeeld, met purchase_time als een tekenreeks en niet als een tijdgegevenstype betekent dat u geen tijdbewerkingen kunt uitvoeren (zoals berekenen hoe lang het geleden is sinds de aankoop) op het veld
  2. te beperkt :MySQL geeft fouten wanneer u waarden probeert in te voeren die groter zijn dan wat het gegevenstype toestaat. We krijgen bijvoorbeeld fouten als we een verkoop hebben met een betaald bedrag van $ 100,00 of meer of een opmerking van een agent die langer is dan 65 tekens
  3. te conservatief :Hoewel niets zal breken met te conservatief te zijn met gegevenstypen, verspilt u opslagruimte. Met onze voorbeeldgegevens zouden we 15% opslagruimte kunnen besparen door de minder conservatieve voorkeursopties te gebruiken

Hoe slim moderne databases ook zijn, de eigenaren van de data weten nog altijd het beste wat voor soort data er wordt opgeslagen en wat de mogelijke waarden zijn die de data binnen afzienbare tijd kunnen aannemen. U moet dus zorgvuldig de gegevenstypen voor elk van uw velden specificeren.

Documentatie over gegevenstypen voor verschillende veelvoorkomende databases vindt u hier:

  • MijnSQL
  • Amazon Roodverschuiving
  • Apache Hive
  • Teradata

Conclusie

Om ervoor te zorgen dat uw database correct functioneert en zo geoptimaliseerd mogelijk is, is het belangrijk om de gegevenstypen voor elk veld in uw tabellen zorgvuldig te selecteren.


  1. Oracle:SQL-query die rijen retourneert met alleen numerieke waarden

  2. Rails en PostgreSQL:rol postgres bestaat niet

  3. Oracle:Null- en niet-null-rijen tellen

  4. Hoe machtigingen voor externe toegang verlenen aan mysql-server voor gebruikers?