De beleefde interpretatie van "NoSQL" is geworden Not Only SQL
. Als je gegevens hebt die inderdaad echt relationeel zijn, of als je functionaliteit afhangt van zaken als joins en ACIDity, dan moet je die gegevens op een relationele manier opslaan. In dit bericht leg ik uit hoe ik MySQL gebruik naast twee NoSQL-gegevensopslag. Bij moderne gegevensopslag op webschaal gaat het erom te begrijpen hoe u de beste tool(s) voor de taak(en) kunt kiezen.
Dat gezegd hebbende, NoSQL is eigenlijk een reactie op het feit dat de relationele methode en manier van denken is toegepast op problemen waar het eigenlijk niet goed bij past (meestal enorme tabellen met tientallen miljoenen rijen of meer). Zodra tabellen zo groot worden, is de typische "best practice" van SQL om handmatig shard te gebruiken de gegevens -- dat wil zeggen, records 1 tot 10.000.000 in tabel A plaatsen, 10.000.001 tot 20.000.001 in tabel B, enzovoort. Vervolgens worden, typisch in de applicatiemodellaag, de opzoekingen uitgevoerd volgens dit schema. Dit wordt application-aware
. genoemd schalen. Het is tijdrovend en foutgevoelig, maar om iets op te schalen met behoud van MySQL voor de lange-tafelwinkel, is het een min of meer standaard MO geworden. NoSQL vertegenwoordigt voor mij de application-unaware
alternatief.
Sleutelwaarde
Toen ik een MySQL-prototype had dat te groot begon te worden voor zijn eigen bestwil, heb ik persoonlijk zoveel mogelijk gegevens verplaatst naar de razendsnelle Membase , die beter presteert dan Memcached en persistentie toevoegt. Membase is een gedistribueerde sleutelwaardewinkel die min of meer lineair schaalt (Zynga gebruikt het bijvoorbeeld om een half miljoen bewerkingen per seconde te verwerken) door meer basisservers aan een cluster toe te voegen -- het is daarom een geweldige em> geschikt voor het cloudtijdperk van Amazon EC2 , Joyent , enz.
Het is algemeen bekend dat gedistribueerde sleutelwaardewinkels de beste manier zijn om een enorme, lineaire schaal te krijgen. De zwakte van sleutel-waarde is opvraagbaarheid en indexering. Maar zelfs in de relationele wereld is de beste methode voor schaalbaarheid om zoveel mogelijk inspanningen op de toepassingsservers te schuiven, door joins in het geheugen uit te voeren op basisapp-servers in plaats van het centrale RDB-cluster te vragen om al die logica te verwerken. Aangezien simple select
plus application logic
zijn echt de beste manier om een enorme schaal te bereiken zelfs op MySQL, de overgang naar zoiets als Membase (of zijn concurrenten zoals Riak
) is niet echt slecht.
Documentwinkels
Soms - hoewel ik minder vaak zou beweren dan velen denken - vereist het ontwerp van een applicatie inherent secundaire indices, bereikquery's, enz. De NoSQL-benadering hiervoor is via een document store
zoals MongoDB
. Net als Membase is Mongo erg goed in sommige gebieden waar relationele databases bijzonder zwak zijn, zoals application-unaware
schalen, auto-sharding
, en maintaining flat response times even as dataset size balloons
. Het is aanzienlijk langzamer dan Membase en een beetje lastiger om puur horizontaal te schalen, maar het voordeel is dat het zeer opvraagbaar is. U kunt parameters en bereiken in realtime opvragen, of u kunt Map/Reduce gebruiken om complexe batchbewerkingen uit te voeren op werkelijk enorme datasets.
Bij hetzelfde project dat ik hierboven noemde, dat Membase gebruikt om tonnen live spelergegevens te leveren, gebruiken we MongoDB om analytische/metrische gegevens op te slaan, en dat is echt waar MongoDB uitblinkt.
Waarom dingen in SQL bewaren
Ik heb het even gehad over het feit dat 'echt relationele' informatie in relationele databases moet blijven staan. Zoals commentator Dan K. opmerkt, heb ik het deel gemist waarin ik de nadelen bespreek van het verlaten van RDBMS, of in ieder geval van het helemaal verlaten.
Ten eerste is er SQL zelf. SQL is bekend en is al lange tijd een industriestandaard. Sommige "NoSQL"-databases zoals Google's App Engine
Datastore (gebouwd op Big Table) implementeert hun eigen SQL-achtige taal (die van Google heet, schattig, GQL voor Google Query Language
). MongoDB pakt het queryprobleem op een frisse manier aan met zijn prachtige JSON-queryobjecten
. Toch is SQL zelf een krachtig hulpmiddel om informatie uit gegevens te halen, wat in het begin vaak het hele punt is van databases.
De belangrijkste reden om bij RDBMS te blijven is ACID
, of Atomicity, Consistency, Isolation, Durability
. Ik zal de staat van Acid-NoSQL niet opnieuw hashen, omdat het goed wordt behandeld in dit bericht
op ZO. Het volstaat te zeggen dat er een rationele reden is Oracle's RDBMS
heeft zo'n enorme markt die nergens heen gaat:sommige gegevens hebben pure ACID-compliance nodig . Als uw gegevens dat doen (en als dat zo is, weet u dat waarschijnlijk heel goed), dan doet uw database dat ook. Bewaar die pH
laag!
Bewerken: Bekijk het bericht van Aaronaught hier. Hij vertegenwoordigt het business-to-business perspectief veel beter dan ik zou kunnen, deels omdat ik mijn hele carrière in de consumentenwereld heb doorgebracht.