Gå til hovedindhold
Version2 it for professionelle
Forsiden

Hovedmenu

  • It-nyheder
  • Blogs
  • It-job
  • It-firmaer
  • Whitepapers
  • Opret bruger
  • Log ind
Du kan logge ind med din e-mail-adresse
Der er forskel på store og små bogstaver i adgangskoden.
Glemt adgangskode?
Se kommentarer (1)
Emner

Læg data i ?skyen?

Af admin adminuser 16. august 2008 kl. 00:20

I sidste post skrev jeg om 'Byggeklods services' og begyndte så småt at diskutere hvordan disse kan bruges i en web applikation. I denne post tager jeg fat i SQL Server Data Services og giver en kort introduktion.

!RDBMS

Data kan vi lægge på disk og selv opbygge en struktur så vi kan skabe, læse , opdatere og slette vores data (CRUD). Typisk foretrækker vi dog et database system, som sikre en fornuftig indeksering, relationer, integritet,  rapportering osv. De fleste af os arbejder i den forbindelse med relationelle databaser.

Med 'sky'-databaser forholder det sig en smule anderledes og sky-databaser som jeg har kigget på er ikke traditionelle RDBMS?er. Deres primære funktion er at udstille en database gennem en simpel model, som kan manipuleres via et webservices api og som understøtter CRUD.

For at citere dokumentationen på Amazons SimpleDB: 'Today, many developers correlate the word "database" with Relational Database Management Systems (RDBMS). While RDBMS offerings provide deep functionality, for many use cases, they introduce more complexity (and more cost) than is necessary.  Many developers simply want to store, process, and query their data without worrying about managing schemas, maintaining indexes, tuning performance or scaling access to their data.?

Og Googles App Engine Datastore: 'The App Engine datastore is not a relational database. While the datastore interface has many of the same features of traditional databases, the datastore's unique characteristics imply a different way of designing and managing data to take advantage of the ability to scale automatically.'    

Det samme er tilfældet med Microsofts SQL Server Data Service (SSDS), som, på trods af navnet, heller ikke er en relationel database. Hver af de tre leverandørers 'sky'-database har sin egen model.  Fælles for dem er at de er relativt simple. Jeg vil i det følgende give eksempler på en sådan simpel model ved hjælp af SSDS. 

SSDS Model - Authority, Container og Entity

Den meget korte introduktion til disse begreber er en Authority kan indeholde en eller flere Containers, som kan indeholde en eller flere Entiteter. Hvis jeg skal forsøge at drage en parallel til RDBMS så kan man opfatte Authority, som en database, Container som tabeller og Entities som tupler i tabellerne. Det er så ikke hele sandheden, men for nu er det ok til en introduktion.

Webservices administration Kommunikationen til SSDS foregår enten ved hjælp af et SOAP eller et REST API.   Eksempel på oprettelse af en database (SOAP/C# - proxy autogenereret på baggrund af service WSDL):

//createAuthority('foo-dyrefoto'); static public void createAuthority(string authorityId) {             using (SitkaSoapService Client proxy = new SitkaSoapServiceClient())             {                 proxy.ClientCredentials.UserName.UserName = "xxxxxxx";                 proxy.ClientCredentials.UserName.Password = "xxxxxxx";                 Scope serviceScope = new Scope();                 Authority auth = new Authority();                 auth.Id = authorityId;                 proxy.Create(serviceScope, auth);             }   }

Metadata for den netop oprettede authority vil kunne hentes via HTTP GET på: http://foo-dyrefoto.data.beta.mssds.com/v1

Den næste trin bliver at oprette en tabel (Container) i vores database (Authority, som nu hedder foo-dyrefoto). I mit tilfælde vil jeg oprette en Container, som hedder 'billeder'. En Container skal have en unik id.

Denne skal placeres i et bestemt namespace ('http://schemas.microsoft.com/sitka/2008/03) ? se createContaner nedenfor!

Eksempel på oprettelse af contaner i uddrag (Java/Rest):

public class CreateContainerUsingREST { final private static String authorityId = "foo-dyrefoto";  final private static String sampleContainerId = ?billeder";  final private static String ssdsContentType = "application/x-ssds+xml";  final private static String HttpPostMethod = "POST"; public static void main(String[] args) { //mangler tildeling af credentials  String AuthorityUri = String.format("https://%s.data.beta.mssds.com/v1/", authorityId);  CreateContainer(AuthorityUri); } private static void CreateContainer(String authorityUri) throws IllegalArgumentException { final String ContainerTemplate = "" + "%s" + ""; if (authorityUri == null || authorityUri.isEmpty()) { throw new IllegalArgumentException("authorityUri"); }

De sidste jeg vil vise i forbindelse med oprettelse af data, er entities i min container(database). Mine entity skabelon med eksempel data ser ud som følger:

            Billede1             Humpbackwhale.jpg             Havdyr             En han pukkelhval fotograferet under efterårstræk mod...             20 DKK             QUasjkl....=

Som det kan ses af denne entity så har SSDS understøttelse for Xml Schema typerne 'string' og 'base64binary'. Derudover understøttes 'boolean', 'decimal' og 'DateTime'. Sidst men ikke mindst er der BLOB support, som pt kun kan bruges over REST.

Et eksempel på oprettelse af en entity med C# og REST:

public static string CreateImage(string id, string title, string category,                                         string description, string price, string data)         {                                     const string EntityTemplate =                 @"                      {0}                      {1}                      {2}                      {3}                      {4}                      {5}                  ";

            return String.Format(EntityTemplate, id, title, category, description, price, data);         }

public static string CreateEntity(string containerUri, string requestPayload)         {             const string HttpPostMethod = "POST";             const string XmlContentType = "application/x-ssds+xml";             string entityUri = null;             WebRequest request = HttpWebRequest.Create(containerUri);             request.Credentials = new NetworkCredential(userName, password);             request.Method = HttpPostMethod;             UTF8Encoding encoding = new UTF8Encoding();             request.ContentLength = encoding.GetByteCount(requestPayload);             request.ContentType = XmlContentType;             using (Stream reqStm = request.GetRequestStream())             {                   reqStm.Write(encoding.GetBytes(requestPayload), 0,                               encoding.GetByteCount(requestPayload));             }             using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())             {                  entityUri = response.Headers[HttpResponseHeader.Location];             }

            return entityUri;         }

        static void Main(string[] args)         {             string ContainerUri = String.Format("https://{0}.data.beta.mssds.com/v1/{1}", authorityId, containerId);             string requestPayload = CreateImage("Billede1", Humpbackwhale,                                                "Havdyr", "En han pukkelhval fotograferet under efterårstræk mod...",                                                "20 DKK", getBase64binaryImage(@"C:\pics\humpbackwhale.jpg"));              CreateEntity(ContainerUri, requestPayload);  }

Når jeg så har oprettet min database med Authority, Container og muligvis lidt mere data aka Entities er jeg klar til at spørge på data. Det er ikke SQL, som bruges hos hverken Amazon, Google eller Microsoft, hver leverandør implementere sit eget forespørgelsessprog. I SSDS er der tale om et sprog, som til forveksling ligner LINQ.

Her er et HTTP GET eksempel: http://foo-dyrefoto.data.beta.mssds.com/v1/billeder?q='from e in entities where e["Kategori"]=="Havdyr" select e'

Med den antagelse at jeg kun har en entity med kategorien 'Havdyr' får jeg følgende retur:

 
    Billede1      19852     Humpbackwhale.jpg     Havdyr     En han pukkelhval fotograferet under efterårstræk mod...     20 DKK     QUasjkl....=  

 

 

Som det kan ses af svaret er der kommet et 'Version'-element på denne entity. Udover 'Id' og 'Version' som vil være at finde på en Entity's metadata kan man også bruge den 'Kind' ' denne vil typisk sættes på hvis man har entities af forskellig type i en Container.

Opsummering

Det var et første kig på en af de data services, som findes på nettet.  Jeg har ikke set meget på Google App Engine Datastore, men kan umiddelbart læse mig til at applikationer, som gør brug af Googles dataservice skal afvikles på Googles servere og pt kun kan skrives i Python (jeg vil dog meget gerne rettes hvis der er andre som har erfaring med denne service).

Amazon Simple DB og Microsoft SSDS er 'klassiske'webservices med løskobling i databehandlingen gennem REST og SOAP API'er.  Fælles for API'erne er at de alle indeholder den forsinkelse, som forespørgelse på en database, der kun er tilgængelig over HTTP, indeholder. Det betyder at som med hvilken som helst anden webservice er programmeringsmodellen, design og arkitekturen sandsynligvis en ganske anden end hvis klientapplikationen lå direkte 'oven på' databasen. På trods af dette vil min næste web applikation komme til at benytte en data service, SSDS, som datalag.

Amazon SimpleDB og Microsoft SSDS  er begge i beta og kommer begge til at have en betalingsmodel tilknyttet.  I dokumentationen for SimpleDB er der kodeeksempler i Java, C#, Perl, PHP og VB.Net. I SSDS kommer eksemplerne i C#, Java og Ruby.

I de næste indlæg i denne could service serie bevæger jeg mig længere op i stakken og kigger bl.a på Identity management, message passing/transformation og Workflow. [/i]

Send Tweet
Udskriv
Om admin adminuserFollow @version2

Kommentarer (1)

Opret en konto eller log ind for at følge indhold på Version2 - og bliv opdateret via e-mail eller rss

Følg kommentarer
Henrik Liliendahl Sørensen 16. aug. 2008 - 12.03
 
Oehlenschlægersgade

Vi har i vores firma et slogan der hedder:

“Databases are just containers: It’s the content that matters.”

Et spændende element ved data i skyen er de enorme muligheder der ligger i at kunne udnytte data, der allerede er opsamlet et andet sted.

For at kunne udnytte dette, er det dog ikke nok at have fælles protokoller. Vi er også nødt at have en fælles definition, navngivning og identifikation af data – eller i det mindste håndtere, at dette er et for stort krav.

Hvis du for eksempel ønsker at vide noget om:

• Oehlenschlægersgade 213 i København

måske for at lave en mashup eller på anden måde at sammenstille data – så har du et problem, når andre data sandsynligvis er lagret under:

• Øhlenslägersgade 213, København V
• Oehlenschlægersgade 213, baghuset, 1663

Byggeklodstjenester til datalaget kan derfor, ud over de rent tekniske og logistiske anvendelser, også bidrage med:

• Indhold i form af konkrete data lige fra valutakurser og postnumre optil store fortegnelser om alverden, som du så kan få forærende – eller nemt købe
• Intelligens til at identificere, strukturere og klassificere data

  • Stem op 0
  • Stem ned 0
  • Log ind eller opret en konto for at skrive kommentarer

Tilføj kommentar

Opret en konto eller log ind for at følge indhold på Version2 - og bliv opdateret via e-mail eller rss

Følg kommentarer
Log ind herunder eller opret en bruger for at skrive kommentarer
Du kan logge ind med din e-mail-adresse
Der er forskel på store og små bogstaver i adgangskoden.
Glemt adgangskode?

Seneste nyt

Danske internetudbydere nægter at blokere 12 pokersites

Udgivet 24. maj 13.58Opdateret 24. maj 13.58

Dokumentation: Her er Spillemyndighedens krav - og 12 ulovlige pokersider

Udgivet 24. maj 13.58Opdateret 24. maj 13.58

Ny blog: Offentlige it-projekter set indefra

Udgivet 24. maj 13.19Opdateret 24. maj 13.30

De 170 fyrede hos IBM Danmark får 30.000 kroner i hånden

Udgivet 24. maj 12.19Opdateret 24. maj 12.19

Google vinder patentsagen om Android: Brød ikke Oracles Java-patenter

Udgivet 24. maj 11.30Opdateret 24. maj 11.30

Flere it-nyheder »

Tilmeld dig Version2's it-nyhedsbrev og vind den nye iPad.

Seneste debat

  1. ESA arbejder på interplanetarisk internet

    4 comments.
    Last update 28 sekunder
    Skrevet af Chano Klinck Andersen
  2. Fokus på ny model når kravspecifikationen skal vurderes

    1 comment.
    Last update 44 sekunder
    Skrevet af Christian Kirkedal
  3. Kynisk it-guru: »Internettet er basalt set noget lort«

    6 comments.
    Last update 7 minutter 40 sekunder
    Skrevet af Nikolaj Brinch Jørgensen
  4. Meego-afløseren Tizen klar til at tage kampen op med Android

    9 comments.
    Last update 22 minutter 35 sekunder
    Skrevet af Dennis Krøger
  5. Oracle tabte, vandt Google Java ?

    13 comments.
    Last update 41 minutter 16 sekunder
    Skrevet af Casper Bang
  6. Das NemID trojaner - paranoia eller rettidig omhu?

    25 comments.
    Last update 42 minutter 43 sekunder
    Skrevet af Gert Madsen
  7. HTML5 – det nye sort?

    16 comments.
    Last update 47 minutter 15 sekunder
    Skrevet af Jesper Brunholm
  8. GOTO - programming with the stars (F#)

    8 comments.
    Last update 57 minutter 36 sekunder
    Skrevet af Torben Mogensen

Mere debat »

Information

  • Kontakt redaktionen
  • Job- og annoncesalg
  • Teknisk support
  • Om Version2
  • Brugerbetingelser
  • Privatlivspolitik

Aktuelle emner

  • Agil udvikling
  • Android
  • Bruttolønsordning
  • Business Intelligence
  • Cloud computing
  • Download Windows 8
  • HTML5
  • Harddisk-priser
  • IE9
  • Intranet
  • It-sikkerhed
  • Kindle Fire
  • Multimedieskat
  • NemID
  • OS X Mountain Lion
  • Open source CMS
  • Projektledelse
  • Scrum
  • Sharepoint intranet
  • Storage
  • Ubuntu 11.10
  • Virtualisering
  • Windows 8
  • Windows Phone 7
  • iOS 5
  • iPhone 4S

Tjenester

  • Android-app
  • iPhone-app
  • RSS-feeds
Følg @version2dk
Tilmeld dig Version2's it-nyhedsbrev og vind den nye iPad.

Version2 udgives af

  • Mediehuset Ingeniøren A/S work Skelbækgade 4 1717 København V
  • Tlf. work 33265300