modelling data on the web - university of...

Post on 26-Jul-2020

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

COMP60411ModellingDataOnTheWeb

TimMorris&UliSattler

Week1Introduction,DataModels,Tables,andSQL

TopicOverviewWhatisa(core)datamodel?E.g.,Flat:flatfilesTablebased:relationalTreebased:XMLandabitofJSONGraphbased:RDF

Tradeoffs(esp.representational)betweenthemDiscussingpainpoints&sweetspots,distinguishing

principledonesfromDM-basedonesfromthosecausedbyyourusageofDM

CourseGoals:Knowledge&Understanding

This aimstogiveyouagoodunderstandingofcoreconceptsofdatamodellingsomefamiliaritywithformalisms,APIs,andlanguages

formodellingdataonthewebdesign/representationissuesthatarise

courseunit

CourseGoals:Skills

This aimstogiveyoutheability/skilltocomparedifferentdatamodellingformalisms,designoranalyseadatamanagementsystem,

doesitmakegooduseoftheformalism'sfeatures?doesitfititspurpose?

courseunit

CourseStructureLectures

ActivelearningLab

Makesureyouunderstandthecoursework!Readings

AllreadingsavailableonlineCore:the"Learning"eBookseries

LearningSQLLearningXMLLearningSPARQL

OurExpectationsLectures:

activelistening&participationLabMondaysafternoon:

makesureyouunderstandthecoursework!Labduringweek:

workonyourcourseworkmakeuseofTAs:14:00-15:00

Coursework:submitontime

Read!

AssessmentCoursework(50%,≈200marks)

Eachweek,amixture1. MCQquizzes(≈10marks)2. Shortessays(≈5marks)3. Amodellingassignment(≈10marks)4. Aprogrammingassignment(≈15marks)Precisemarkbreakdownvaries

Exam(50%)TakenonlineVerylike1&2

Materials&BlackboardAllcoursematerialsareavailableonlineonthematerialspageWeuseBlackboardfor

CourseworkOnlineforums

SubscribetoeachforumAskquestionsthereAnswerquestionsthereShareexamples,testcasesthere

Exam

VariantCircumstancesDisability(EqualityAct):

anyconditionwhichhasasignificant,adverseandlong-termeffectonaperson’sabilitytocarryoutnormalday-to-dayactivities.

Exam&Studysupport&moreGreat,helpfulpeople

and process

DisabilityAdvisoryandSupportService

CounsellingserviceSSO MitigatingCircumstances

...feelfreetoaskus:we'rehappytoadvise!

Assistance&HelpEarlyinterventionismoreeffective

Ifyouarehavingchallengesofanysortthesoonertheyareidentifiedandcommunicatedtousthemorelikelywecanfindagoodresolution

ThisisverytrueformitigatingcircumstancesIfsomethingisinterfering,documentit!FillouttheformwhenthingsarehappeningThereisa"toolate"here!

...whenindoubt,askusandSSOforMitCircs

ExpectedConductWeexpectofyou(andourselves)to

befairmindedtreateachotherwell&withrespectavoidacademicmalpracticetakeresponsibilityforcoursedutiesbeengaged,curious,andactive

Ifyouhaveaproblemorissuepleaseraiseitwithusifthatdoesn'thelp,contactyourprogrammedirector

Preliminaries

Weallhavetostartsomewhere

DataManagement(1)Almosteveryprogrammustdosomedatamanagement

Ifonlyconfigfiles!Manyareinformationheavy

andmustdealwiththatinformationovertimeDatabaseManagementSystems(DBMSs)

Separate(orseparable)componentSpecialisedforvariablespurposed

secondarystorage,scaling,complexity,etc.

DataManagement:Lifetime

Somedatais(typically)transientorephemeralPositionofthecursoronthescreen

Somedatais(typically)persistentBankrecords,addresses,healthdata,libraryentriesCursorpositioncanbe!

(Ifyouarerecordingthescreen...)

We'refocusedondatathatleanstowardpersistent

DataManagement:Structure

Somedatais(moreorless)informationallyopaquee.g.,images,video,text,audioitsinformation/contentisn't(easily)available

Youtypicallymustdosomeextractionthisiscalledunstructureddata

Somedataisinformationallytransparentitsinformation/contentisprogrammaticallyexplicitthisiscalled(semi-)structureddata

OutOfScopeThereislotsofDMthat'soutsideourscope1. Performance&Scaling:see2. Concurrency

Thustransactions(YoushouldreaduponACIDity)

3. Tuning,indeedmostphysicallevelstuff4. Cleansing5. Integration

Exceptforatinybit,aroundmerging

COMP62421

Theseconsiderationsdoaffectmodelling!

DataAndTheWebTheWebisacollaborativeinformationstructure

LargelydecentralisedImmenseGrowingrapidlyChangingrapidly

TheWebproducesnewdatachallengesScaleofdataKindofdataShapeofdataUseofdata

Dataon,from,behindtheWebOntheWeb

data.gov,data.gov.uk,...FromtheWeb

LogfilesBehindtheWeb

Data(base)backedWebsitesThefilesystemisakindofdatabase

ContentManagementSystemsWordpress

SitesasDatabaseFrontEndsSeeAmazon

WhatisaDataModel?ThreeKeyAspects1. UnderlyingDataStructure,"CoreDataModel"2. DataIntegrity3. DataManipulation4. (Plusafourth!)DataSharing

MoreimportantontheWeb*

"DataModel"isAmbiguous:1. acompletedatarepresentationandmanipulationapproach(wedothis!)2. justthecoredatamodel3. aparticulardatarepresentationforadomainorapplication,alsocalledthedomainmodel

"Doesyourcalendardatamodelincludeleapyears?"

Generally,youcantellfromcontext,(2)israre.

KindsofDataDatacanlenditselftodifferentshapes

Array-likeTree-likeGraph-likeDocument-like

DatacanhavedifferentvolumesSmallto"big"data

DatacanhavedifferentvelocitiesStatic/offlinetostreaming

DatacanhavedifferentusepatternsManyreaders/fewwritersorthereverseorother!

DataDoesNotGrowonTreesDatamaylenditselftooneshape

e.g.,tree-shapeorgraph-shapebutthisdoesnotmeanthat

wehavetopersistitinthisformweknowexactlyhowtocastitinthisform...considerpain-pointsandsweetspotsothersshareitinthisform

PolyglotPersistence...we are gearing up for a shift to polyglot persistence — where anydecent sized enterprise will have a variety of different data storagetechnologies for different kinds of data. There will still be largeamountsof itmanaged in relational stores,but increasinglywe'llbe firstaskinghowwewanttomanipulatethedataandonlythenfiguringoutwhattechnologyisthebestbetforit.

—MartinFowler

PolyglotPersistence(2)Thispolyglot[e]ffectwillbeapparentevenwithinasingleapplication.Acomplex enterprise application uses different kinds of data, and alreadyusuallyintegratesinformationfromdifferentsources.Increasinglywe'llsee such applications manage their own data using differenttechnologiesdependingonhowthedataisused.—MartinFowler

Poly-Glot/-SystemPersistenceEvenasinglecoredatamodelcanresultin

multiplesystemswithdifferentcharacteristicsmultiple,overlapping,domainmodelsmultiple,overlappingowners,versions,variants

ThisisparticularlytrueinontheWeb!

ASampleDomainWestartwithaclassicexample:TheAddressBook

PeopleandinformationaboutthemNamesandcontactinformation

Wecandoafirstcutasadiagram

ForExampleBijan!

Name:BijanParsiaCompany:UniversityofManchesterEmail:bijan.parsia@manchester.ac.uk...

Uli!Name:UliSattlerCompany:UniversityofManchesterEmail:uli.sattler@manchester.ac.uk

Storing!

SlidesarenotagoodstorageplacefordataWehaveanarraylikestructureso...

Howaboutaspreadsheet!1entity/record/personperrowEachfield/attributeisacolumn

Wehavesoftwarethatworkswellwiththis!

InteractingWithTheData

Tothedemo!

PainpointsAround"name"

SortingisoncolumnsCannotsortbysurname

Filtering:canfilterbynamesbeginningwithZCannotfilterbysurnamesbeginningwithZ

Around"address"Can'tsortorfilterbypostcodeCan'tsortorfilterbycityCan'tsortorfilterbycounty

Problemswithspreadsheetsorourformat?

Format2Thisshouldfixourpainpoints!

Interacting!

Demoencore!

NewPainPointsVariablenumbersofthe"same"attribute

PhonenumberEmailaddressWebpageInsertingcolumnsispainful

LotsofpartialcolumnsSheernumbersucks

Companieshaveaddresses!Morethanone!Andphonenumbers,etc.

Moreproblemswithourformat

NOTANewFormatNotafixtoourformat:

FixingTheFormatAgainWewantaddinga(similar)columntobeeasy!

Easyasaddingarow!MakeanewtablejustforphonenumbersIndexnumberswithpersonrows

Format3Nowthisshouldfixourpainpoints!

StillPainPointsSortingdestroystherelationship

WeusedrownumberstoconnectSortingchangestherownumber!

HardtoseetherecordNolongerasimpleflatfile

CSVformatmakesassumptions

Theseare(mostly)implementationproblems!

AnalyseFormatFailureDidwe

getthedomainwrong(addresses)?fititwrongintoourcoreDM(tables)?pickthewrongcoreDMtomodelitin?

Isourformatunworkable?workablebutrequiresalotofapplicationcode?reasonablewithsomeworkarounds?

Howmuchtechnicaldebtarewepilingup?What'sthecostofswitching?

UnsuitableCoreDataModelIfyouare

always"fighting"thesystemuselotsofapplicationcodetohackthingsliveinanerrorrichenvironmenthaveincreasingamountsofworkaroundsupportinyourdata

Yourcoredatamodelmightnotbeagoodfitforyourdomainandapplication!

TheRestOfTheDBMSEvenifyourcoreDMisn'tagoodfit,youmight

bestuckwiththesystemYoupaidgoodmoneyforthatOracledatabase!

needfeaturesoftheimplementationisthereanXMLdatabasewithtransactions?what'sthesupportcontract?

bestuckwiththemodel(criticallegacyapps)Justbecausethemodelisbrokendoesn'tmeanthatthesystemis

Orisbrokenenoughtojustifyaswitch

FlatFileProgramming

SharingOurDatabasesSpreadsheets?Propriatory-ish(Excel,GoogleDoc,OpenOffice)

Linguafranca:CSVComma(orTab)DelimitedValuesExactlythe(pure)flatfilemodelFormat:textfile

1recordperlineFirstlinecanbespecial(columnnames)Eachcolumnseparatedbya","

Wemayneedtoquotecells(withcommas)

CSVExample

ProgrammaticManipulationIfwestoreourdatabasesasCSV

WecanloadandparsethemintostructuresManipulateourdatafromourprograms

E.g.,usingPythonimport csvwith open("../Adresses/mod2-uk-500.csv") as csvfile: line_count = 0 myreader = csv.reader(csvfile, delimiter=',', quotechar='t') for row in myreader: if line_count == 0: line_count += 1 else: print(f' Candidate {line_count}: Firstname {row[0]} Lastname {row[1]} City {row[4]}') line_count += 1print(f'Processed {line_count -1} Candidates.')

SolvingProblemsThissolvessomeproblems!

Inserting/removingcolumnsa"smallmatterofprogramming"Orwecouldusemultiplearrayswithpointers

Wecansplit/combinefieldsatwillWell,withabitofprogramming

WecancontrolsortingwellenoughUsepointerstoconnect

Lotsofwork!

AgainstBespokeProgrammingThisisallatthewronglevel

Flatfilesandflatfile++areubiquitousWeshouldn'tbecodingcomplexfunctions

Overandoveragain!Evenifwecanprogramourwayaroundproblems

Doesn'teliminatetheproblemsSomesolutions(pointers)effectivelychangethecoremodel:nolongerflatfiles!

TablesAcoreDMwheretable(orrelation)isthecoredatastructure

AtableisasetoftuplesAtupleis

ann-arysequenceasetofkey-valuepairs

FlatfilehadonetableWeallowmany!NamedtablesAkarelations

Relations!(Weusetableandrelationinterchangeably)RelationsarelikeFirstOrderLogic(FOL)predicates

Relationname=PredicatenameNumberofcolumns=Arityofpredicate

Person(bijan,u_o_manchester,...)Predicateistrue(orfalse!)ofitsarguments

Relationis"true"oftupleswhichoccurinitPredicatescanhavedefinitions(intensional!)facts(extensional!)

OrderandIdentityRecords/Rows/Entitiesneedidentity

InExcel,wehadtherowlabeltheorderorpositionofarecordwassignificant

Inourmodel,weneeddistinguishingattributeswepushidentityintothedata:akey

eithera"naturally"uniquesetofattributesoramadeupone:anID

Orderisalwaysapropertyofthedatavaluesimplementation

MultipleTablesActionsonmultipletables:Splittingat

designtime:trytonormalizeyourDBruntime:droppingbits

CombiningTaketwotablesandproduceanewtable

ThekeytorelationaldomainmodellingDecomposeyourprobleminto"base"tablesDerivenewtablesforspecificneeds

WhatIsAFormalism?Aformalsystem(orformalism):syntax:whatcanwewrite?semantics:whatdoesourwritingmean?withprecise(mathematical)definitionsdesignedtocaptureacoherentsetofoperations("syntax"isloose,e.g.,wemightjusthaveacollectionofoperators)

KeyGoalsOfAFormalism1. tobeclearaboutwhatwemean

Inourspreadsheetis"1"anumber,astring,either,both,somethingelse?

2. toallowthedeterminationofkeypropertiese.g.,complexityofqueryanswering

3. toabstractawayfromparticularimplementionse.g.,allowustodeterminewhenwildlydifferentimplementationsarecorrectthuscaninteroperate

Formalismvs.LanguageFormalismsareoftenabstract

Thiscanbeanadvantage!CanbehardtouseifonlyabstractConcreteinstancestypicallyinvolvecompromise

WefocusonconcretelanguagesFormalismsarethetheoryLanguagesarethepractice

Well,itmaybeallrightinpractice,butitwillneverworkintheory.Intheory,thereisnodifferencebetweentheoryandpractice.But,inpractice,thereis.

OtherQuotesOnTheoryvsPractice

SQL:ALanguageForTablesSchema

CREATE TABLEtable_nameUpdate

INSERT INTOtable_nameDELETE FROMtable_nameUPDATEtable_name...

QuerySELECT ... FROMtable_name

SQLoperations(largely)areclosedovertables

AnInfelicityThereisalotoflingowithslightdifferentmeanings.Conceptsgetdividedup

inslightlydifferentways.

Ourtalk Common LearningSQLp.10

CoreDataModelDataIntegrity DataDefinition SQLschemastatements"CREATE"

DataManipulation Query/UpdateLanguage

SQLDatastatements

ASampleSQLProgramCREATE TABLE People ( name varchar(255), company varchar(255), address varchar(255), phone varchar(255), email varchar(255), home_page varchar(255));

INSERT INTO People VALUES ('Aleshia Tomkiewicz', 'Alan D Rosenburg Cpa Pc', '14 Taylor St, St. Stephens Ward, Kent CT2 7PP', '01835-703597','atomkiewicz@hotmail.com', 'http://www.alandrosenburgcpapc.co.uk');SELECT name FROM People

YoumustDefinebeforeUpdatebeforeQueryI.e.,CREATEbeforeINSERTbeforeSELECT

ModellingWithSQLSQLletsusexpressmodelsatthelogicalto(someofthe)physicallevel

SpecifyingindicesisabitphysicalKnowledgeaboutimplementationmayinformmodellingchoices

SQLhasnomechanismsforconceptuallevel

Format1InSQL

Format1InSQL CREATE TABLE People ( name varchar(255), company varchar(255), address varchar(255), phone varchar(255), email varchar(255), home_page varchar(255));

INSERT INTO People VALUES ('Aleshia Tomkiewicz', 'Alan D Rosenburg Cpa Pc', '14 Taylor St, St. Stephens Ward, Kent CT2 7PP', '01835-703597','atomkiewicz@hotmail.com', 'http://www.alandrosenburgcpapc.co.uk');...

Canwedoallthatwedidinthespreadsheet?

SQLManipulationofFormat1CountrecordsinyourPeopletable:

Searchforitems:

Sortthetable!

SELECT COUNT(*) FROM People

SELECT * FROM PeopleWHERE name like 'Aleshia%'

SELECT * FROM PeopleWHERE name like '%Tomkiewicz'

SELECT * FROM PeopleORDER BY name asc

Format2InSQL

Format2InSQL CREATE TABLE People ( first_name varchar(255), surname varchar(255), company varchar(255), street_address varchar(255), city varchar(255), county varchar(255), post_code varchar(255), phone varchar(255), email varchar(255), home_page varchar(255));

INSERT INTO People VALUES ('Aleshia', 'Tomkiewicz', 'Alan D Rosenburg Cpa Pc', '14 Taylor St', 'St. Stephens Ward', 'Kent', 'CT2 7PP', '01835-703597','atomkiewicz@hotmail.com', 'http://www.alandrosenburgcpapc.co.uk');...

SQLManipulationofFormat2Theoldquerieswork,butwecanimprovethem

Searchforitems:

WecanrecreateFormat1!

SELECT * FROM PeopleWHERE first_name = 'Aleshia'

SELECT * FROM PeopleWHERE surname = 'Tomkiewicz'

SELECT first_name || " " ||surname as name, street_address || ", " ||city ||", "|| county ||" " || post_code as address,phone,email,home_pageFROM People

Format3InSQL

Format3InSQL CREATE TABLE People ( person_id SMALLINT UNSIGNED, first_name varchar(255), surname varchar(255), company varchar(255), street_address varchar(255), city varchar(255), county varchar(255), post_code varchar(255), email varchar(255), home_page varchar(255), CONSTRAINT pk_person PRIMARY KEY (person_id));

CREATE TABLE Phone ( person_id varchar(255), number varchar (255), CONSTRAINT pk_phone_number PRIMARY KEY (number));

INSERT INTO People VALUES ('1','Aleshia', 'Tomkiewicz', 'Alan D Rosenburg Cpa Pc', '14 Taylor St', 'St. Stephens Ward', 'Kent', 'CT2 7PP', 'atomkiewicz@hotmail.com', 'http://www.alandrosenburgcpapc.co.uk');INSERT INTO Phone Values ('1', '01835-703597')INSERT INTO Phone Values ('1', '01944-369967')

SQLManipulationofFormat3RecreateFormat1andFormat2:easyFindeveryonewithsamephonenumberCanwehaveunassignedphonenumbers?

Howdidourformatsdo?CoreDM/Datastructure:Tablesseemtowork!SQLandRelationalModel

Wecandoeverything!AllqueriesinallmodelsFormat3has2tables/requiresjoins

Format3Neaterinsertinganddeleting

Canhaveasmanyphonesasyouwant!Everyotherdomainmodelcanbederived

Justwritethequery!

ExpressivePowerSQLisexpressive

ThecoredatamodelisrichComposingandfilteringtablesdoesalot!Operatorsandfunctionshelpful

Withoutconcat(...),there'dbetrouble!Thelanguageispowerful

ReasonablycomposableLotsoffeaturesExtended&extensibleinmanyimplementations

Interopproblems!

QueryingWithSQL

SchemasVs.QueriesCREATEstatements

"create"emptytablesoutofnothingatallwithcertainconstraintswithsomeexpectationofpermanence

SELECTstatements"generate"newtables(possiblywithdata)outofexistingtablesaccordingtosomeconstraintswithnoexpectationofpermanence

ClosedOverTablesSQLis(mostly)closedovertables

MostSQLconstructstake&producetablesClearexception:Functions!

ManipulationismanipulationoftablesNotrows,columns,orcellsdirectlyRows,columns,andcellsare"degeneratetables"...

FilteringKeyoperationSELECT:ignoringsomeparts

Basically"find"CanfilterrowsorcolumnsorbothRequires"testing"functionsonvalues

FilteringColumnsaka"Projection",specifiedinSELECTclause

Keepallcolumns:

Justasinglecolumn:

Multiplecolumns:

Renamecolumns:

SELECT * FROM People

SELECT county FROM People

SELECT name, county FROM People

SELECT street_address AS address FROM People

FilteringrowsSelectingspecifictuplesSpecifiedintheWHEREclauseofyourquery:

Equality:

Range:

Compoundcriteria:

SELECT * FROM People WHERE surname = "Smith"

SELECT * FROM PeopleWHERE heartrate > 95

SELECT * FROM PeopleWHERE heartrate > 95 AND county="Kent"

BuildingTableswithCrossJoinThefundamentaloperationisCartesianproduct

T1xT2forexamplePeoplexPhone

MakesanewrowforeverypairofrowsfromT1&T2What'sthesizeoftheresult?

Notreallyauser-orientedfeature"Incidentally"crossjoinsaredangerous!

BuildingTablesWithInnerJoinAninnerjoinisajoinfilteredoncommoncolumns

Usefulforourphonerecords!

Theaboveisspecialcase,called"natural"joincanbewrittenasfollows:

SELECT * FROM People, PhoneINNER JOIN ON People.person_id = Phone.person_id

SELECT * FROM People NATURAL JOIN Phone

BuildingTableswithOuterJoinAnouterjoinislikeaninnerjoinbutitreturnsalsorowsthatdonothaveamatchintheothertable

leftouterdifferentfromrightouterSELECT * FROM People, PhoneRIGHT OUTER JOIN ON People.person_id = Phone.person_id

willreturnalsopeoplewhohavenophone!

BuildingAndFilteringOncewe'vebuiltatablewecanfilterthingsweneed:

SELECT * FROM People, PhoneRIGHT OUTER JOIN ON People.person_id = Phone.person_idWHERE People.surname = "Smith"

...youknewthatalready!?

TheCostAkeyissuewithjoins

WorstcasefortheircomputationisaCROSSEvenifyoudon'tgeneratetheCROSS

Youmighthavetoconsiderallthepairs(Ifyouaren'tcareful)

GoodoptimisersavoidbothConsideringlotsofmatches(thinkindexes)Generatinglargeintermediatetables

MultiplePhoneColumnsSomepeoplehavenoneoroneOrnoemailorwebpage

NoSurnameEvenifwenormalisedthataway

Somepeopledon'thaveasurname!

Nullnullisadistinguishedvaluewhichcanmean:

"Valuenotyetknown""Notapplicabletothisentity""Valueundefined"checkout

Keyproperty:Unequaltoeverythingnull = nullisnevertrueMatchonnotnull,ratherthannull

LSQL

Strangevalue!

OuterJoinsIfyouhavenonullsinyourbasetables

youcan'tgetthemintablesderivedbyinnerjoinHowever,the2phonecolumntableisderivable

WeusetheouterjoinOuterjoinstakeatableT

foreachrowinTextenditwiththe(projected)columnsfromanothertableIfthere'samatch,addthematchedvalues*else,addnulls

SeeLearningSQL forexamplesChapter10

NullProliferationnullnevermatches

SoiteratedouterjoinsproliferatenullsAsyougetwider,yougetsparser

Ifyouarematchingonasparseattributenullsposechallengeforrelationaltheory

AndsomewhatforpracticeStartsmovingfromthesweetspot

SQLDrivenWebsitesManywebsitesarebackedbyadatabase

PHPmakesiteasyConsiderWordPressandotherCMSs

LotsofunstructuredcontentStuffinblobsandtextfields

KeypropertiesScalingACID:Atomicity,Consistency,Isolation,Durability

TransactionsConcurrentaccess

Thereisa thatisstillgoodreading,espchps -

keyhistoricaltext11 12

CSV&SQLprogramsontheWeb

Othergovernmentrepositories:data.govdata.gov.uk

Scientificsitesallaboutclinicaltrials!

allaboutproteins!...

UNDatarepository

ClinicalTrials.govUniProt

GoogleQueryVizLanguageASQLlikelanguage

UsedinGoogleDocsSpreadsheetQUERYfunctiontakesqueriesasargument

WebSQLTheWhatWGandW3CtriedtostandardizeWebSQL

This specification introduces a set of APIs to manipulate client-sidedatabasesusingSQL.

Localdatabasebackedwebapps

ForofflineuseJustincreasedcapabilities

function prepareDatabase(ready, error) { return openDatabase('documents', '1.0', 'Offline document storage', 5*1024*1024, function (db) { db.changeVersion('', '1.0', function (t) { t.executeSql('CREATE TABLE docids (id, name)'); }, error); });}

Whatisthisdata?Arecurringissue:whatisinthisshareddocument?

csvtableJSONsnippet...

Whatdoesitmean?Howtoparse?Howtoshare?Sothatit'sgoodtouse?Self-DescribingandMeaningwillbediscussedatlength

AnyQuestionsSoFar?

Labs&CourseworkNext,wegototheLabsYoulookinBBatWeek1coursework:

QuizQ1ShortEssaySE1SmallModellingexerciseM1SomequeryingCW1

Read,think,askus!

top related