2.1 Car-Racing Example, JSON Documents
The car-racing example has three kinds of documents: a team document, a driver document, and a race document.
A document supported by a duality view always includes, at its top (root)
level, a document-identifier field,
_id
, which corresponds to (all of) the identifying columns
of the root table that underlies the view. See Document-Identifier Field for Duality Views. (In the car-racing example the root table of each duality view has a
single identifying column, which is a primary-key column.)
The following naming convention is followed in this documentation:
-
The document-identifier field (
_id
) of each kind of document (team, driver, or race) corresponds to the root-table identifying columns of the duality view that supports those documents. For example, field_id
of a team document corresponds to identifying (primary-key) columnteam_id
of tableteam
, which is the root table underlying duality viewteam_dv
. -
Documents of one kind (e.g. team), supported by one duality view (e.g.
team_dv
) can include other fields named...Id
(e.g.driverId
), which represent foreign-key references to identifying columns in tables underlying other duality views — columns that contain data that's shared. For example, in a team document, fielddriverId
represents a foreign key that refers to the document-identifier field (_id
) of a driver document.
Note:
Only the application-logic document content, or payload of each document, is shown here. That is, the documents shown
here do not include the automatically generated and maintained, top-level field
_metadata
(whose value is an object with fields
etag
and asof
). However, this
document-handling field is always included in documents supported by a
duality view. See Creating Duality Views for information about field _metadata
.
Example 2-1 A Team Document
A team document includes information about the drivers on the team, in addition to information that's relevant to the team but not necessarily relevant to its drivers.
-
Top-level field
_id
uniquely identifies a team document. It is the document-identifier field. Columnteam_id
of tableteam
corresponds to this field; it is the table's primary key. -
The team information that's not shared with driver documents is in field
_id
and top-level fieldsname
andpoints
. -
The team information that's shared with driver documents is in fields
driverId
,name
, andpoints
, under fielddriver
. The value of fielddriverId
is that of the document-identifier field (_id
) of a driver document.
{"_id" : 302,
"name" : "Ferrari",
"points" : 300,
"driver" : [ {"driverId" : 103,
"name" : "Charles Leclerc",
"points" : 192},
{"driverId" : 104,
"name" : "Carlos Sainz Jr",
"points" : 118} ]}
Example 2-2 A Driver Document
A driver document includes identification of the driver's team and information about the races the driver has participated in, in addition to information that's relevant to the driver but not necessarily relevant to its team or races.
-
Top-level field
_id
uniquely identifies a driver document. It is the document-identifier field. Columndriver_id
of thedriver
table corresponds to this field; it is that table's primary key. -
The driver information that's not shared with race or team documents is in fields
_id
,name
, andpoints
. -
The driver information that's shared with race documents is in field
race
. The value of fieldraceId
is that of the document-identifier field (_id
) of a race document. -
The driver information that's shared with a team document is in fields such as
teamId
, whose value is that of the document-identifier field (_id
) of a team document.
Two alternative versions of a driver document are shown, with and without nested team and race information.
Driver document, with nested team and race information:
Field teamInfo
contains the nested team information
(fields teamId
and name
). Field
raceInfo
contains the nested race information (fields
raceId
and name
).
{"_id" : 101,
"name" : "Max Verstappen",
"points" : 258,
"teamInfo" : {"teamId" : 301, "name" : "Red Bull"},
"race" : [ {"driverRaceMapId" : 3,
"raceInfo" : {"raceId" : 201,
"name" : "Bahrain Grand Prix"},
"finalPosition" : 19},
{"driverRaceMapId" : 11,
"raceInfo" : {"raceId" : 202,
"name" : "Saudi Arabian Grand Prix"},
"finalPosition" : 1} ]}
Driver document, without nested team and race information:
Fields teamId
and team
are not nested in a
teamInfo
object. Fields raceId
and
name
are not nested in a raceInfo
object.
{"_id" : 101,
"name" : "Max Verstappen",
"points" : 25,
"teamId" : 301,
"team" : "Red Bull",
"race" : [ {"driverRaceMapId" : 3,
"raceId" : 201,
"name" : "Bahrain Grand Prix",
"finalPosition" : 19},
{"driverRaceMapId" : 11,
"raceId" : 202,
"name" : "Saudi Arabian Grand Prix",
"finalPosition" : 1} ]}
Example 2-3 A Car-Race Document
A race document includes, in its information about a particular race, information about the podium standings (first, second, and third place), and the results for each driver in the race. The podium standings include the driver and team names. The result for each driver includes the driver's name.
Both of these include driver and team names.
-
Top-level field
_id
uniquely identifies a race document. It is the document-identifier field. Columnrace_id
of therace
table corresponds to this field; it is that table's primary key. -
The race information that's not shared with driver or team documents is in fields
_id
,name
(top-level),laps
,date
,time
, andposition
. -
The race information that's shared with driver documents is in fields such as
driverId
, whose value is that of the document-identifier field (_id
) of a driver document. -
The race information that's shared with team documents is in field
team
(underwinner
,firstRunnerUp
, andsecondRunnerUp
, which are underpodium
).
Two alternative versions of a race document are shown, with and without nested driver information.
Race document, with nested driver information:
{"_id" : 201,
"name" : "Bahrain Grand Prix",
"laps" : 57,
"date" : "2022-03-20T00:00:00",
"podium" : {"winner" : {"name" : "Charles Leclerc",
"team" : "Ferrari",
"time" : "02:00:05.3476"},
"firstRunnerUp" : {"name" : "Carlos Sainz Jr",
"team" : "Ferrari",
"time" : "02:00:15.1356"},
"secondRunnerUp" : {"name" : "Max Verstappen",
"team" : "Red Bull",
"time" : "02:01:01.9253"}},
"result" : [ {"driverRaceMapId" : 3,
"position" : 1,
"driverInfo" : {"driverId" : 103,
"name" : "Charles Leclerc"},
{"driverRaceMapId" : 4,
"position" : 2,
"driverInfo" : {"driverId" : 104,
"name" : "Carlos Sainz Jr"},
{"driverRaceMapId" : 9,
"position" : 3,
"driverInfo" : {"driverId" : 101,
"name" : "Max Verstappen"},
{"driverRaceMapId" : 10,
"position" : 4,
"driverInfo" : {"driverId" : 102,
"name" : "Sergio Perez"} ]}
Race document, without nested driver information:
{"_id" : 201,
"name" : "Bahrain Grand Prix",
"laps" : 57,
"date" : "2022-03-20T00:00:00",
"podium" : {"winner" : {"name" : "Charles Leclerc",
"team" : "Ferrari",
"time" : "02:00:05.3476"},
"firstRunnerUp" : {"name" : "Carlos Sainz Jr",
"team" : "Ferrari",
"time" : "02:00:15.1356"},
"secondRunnerUp" : {"name" : "Max Verstappen",
"team" : "Red Bull",
"time" : "02:01:01.9253"}},
"result" : [ {"driverRaceMapId" : 3,
"position" : 1,
"driverId" : 103,
"name" : "Charles Leclerc"},
{"driverRaceMapId" : 4,
"position" : 2,
"driverId" : 104,
"name" : "Carlos Sainz Jr"},
{"driverRaceMapId" : 9,
"position" : 3,
"driverId" : 101,
"name" : "Max Verstappen"},
{"driverRaceMapId" : 10,
"position" : 4,
"driverId" : 102,
"name" : "Sergio Perez"} ]}
Related Topics
Parent topic: Introduction To Car-Racing Duality Views Example