In simple term, data services are exposing data as web services. Anyway it is not a complete definition. Actually there are situations where we use data services not only to read data, but also to create, update or delete data. So it is better say data services are doing CRUD (Create, Read, Update, Delete) operations for data through web services. Simply it is like providing a web service interface for the database.
Anyway exposing a database directly as a web service is like violating the first principles of software engineering. It will tightly couple the database structure with the interface, so whenever you do a simple change to the database schema, you will have to change the web service interface which will no doubt break all the clients depending on it.
So first of all, you have to design the service interface independent of the database schema you have. Most of the time you will able to find some query that would map the service interface to the database schema.
For an example think of publishing data in database table (say for table name “Games”) like this.
| Teams |
| GameID |
Venue |
Date |
Team1 |
Team2 |
Team1Score |
Team2Score |
| 1 |
xxx stadium |
2008-12-18 |
Italy |
Sweden |
34 |
33 |
| 2 |
yyy stadium |
2008-12-19 |
France |
Spain |
51 |
50 |
You will directly able to map these data to data service. So the response payload for a “getGames” operation would be something like,
<getGamesResponse>
<Game>
<Venue>
xxx stadium
</Venue>
<Date>
2008-12-18
</date>
<Team1>
Italy
</Team1>
<Team2>
Sweden
</Team2>
<Team1Score>
34
</Team1Score>
<Team2Score>
33
</Team2Score>
</Game>
<Game>
<Venue>
yyy stadium
</Venue>
<Date>
2008-12-19
</date>
<Team1>
France
</Team1>
<Team2>
Spain
</Team2>
<Team1Score>
51
</Team1Score>
<Team2Score>
50
</Team2Score>
</Game>
</getGamesResponse>
You can get this done with a SQL query simply as this,
SELECT * FROM `Games`
Say later if you decided to restructure the database table so the new database schema would be like this,
| Games |
| GameId |
Venue |
Date |
| 1 |
xxx stadium |
2008-12-18 |
| 1 |
yyy stadium |
2008-12-19 |
| GamesTeams |
| GameId |
TeamId |
score |
| 1 |
1 |
70 |
| 1 |
2 |
33 |
| 2 |
1 |
51 |
| 2 |
3 |
50 |
| Teams |
| TeamId |
Name |
Coach |
| 1 |
Italy |
Mr. ABC |
| 1 |
Canada |
Mr. PQR |
| 2 |
Spain |
Mr. XYZ |
(Note here the Games and Teams are associated in the GamesTeams table.)
You can still use a query like the one in following to provide the same service interface, because it returns the same result set as the earlier one.
SELECT Games.Venue,
Games.Date,
Team1.Name AS Team1,
Team2.Name AS Team2,
GameTeam1.Score AS Score1,
GameTeam2.Score AS Score2
FROM Teams Team1,
Teams Team2,
GamesTeams GameTeam1,
GamesTeams GameTeam2,
Games
WHERE GameTeam1.gameId = Games.gameId AND
GameTeam2.gameId = Games.gameId AND
GameTeam1.teamId = Team1.teamId AND
GameTeam2.teamId = Team2.teamId AND
Team1.teamId <> Team2.teamId AND
Team1.name=?
This allows you to keep the ser