Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

SAP Developer Challenge - Full-Stack - Project Set-up and Database Modeling (Week 1)

dinah
Employee
Employee

If you have not checked out the initial blog post for this challenge, please do so and get your development environment set up as outlined in the post. 

Task Description 

We are working on creating test(s) for a particular course/subject. We need to have a pool of questions (related to the course/subject) that we can pick from to make up a test. A single test can be associated with several questions, but each question belongs to only one test. Through the relationship between tests and questions, one should be able to access all questions related to a specific test and easily access the specific test to which a question belongs (hint: backlink). 

Additionally, we need to have a right answer for every question and a question can only have one right answer. An answer cannot exist without a question. If a question is deleted, so should the linked answer be deleted. 

We will get started with database modeling using SAP CAP. We delve into the architecture, carefully defining two core entities and an aspect respectively: "Tests," "Questions," and "Answers".  

Tests Entity – serves as a container for organizing different test cycles. Each entry within the Tests entity represents a unique object with attributes such as test ID, title, description, createdAt, createdBy, modifiedAt, modifiedBy and any other vital information relating to tests. A single test can have many questions. This entity allows us to categorize and manage tests efficiently, facilitating easy retrieval and presentation of tests data. 

Questions Entity – serves as a repository for individual questions comprising the intellectual content of our tests. Each entry in the Questions entity comprises attributes such as ID, text, and any other vital information relating to questions. Many questions can be associated with a single test, but each question belongs to only one test (that is, two different tests cannot have the same question). Centralizing questions in this entity allows us to create a cohesive reservoir of knowledge that can be easily linked to a Test instance. 

Answers Aspect– records the correct answer to a particular question. Each record in this aspect corresponds to a correct answer linked to a specific question. Each entry in the Answers aspect comprises attributes such as ID, and text. The separation of answers from questions reinforces data integrity. 

Why an Aspect instead of Entity for the Answers? 

Aspects are well suited for representing data that does not have a distinct identity of their own. In our schema design, the answers cannot exist without a question. For example, if a question record is deleted, we would want an answer associated with it to be deleted as well. Using an aspect in this case allows us to associate answers data directly with questions without creating a separate entity.  

 

Task outline 

Our goal is to perform entity-relationship modeling based on the above entities' description and then populate initial data in csv files to be used in the next tasks. Below is a visual representation providing details (entity properties and data types) to help with the modeling. 

Schema.png

Steps 

  1. Model the entities in the db/data-model.cds file. 
  2. Declare the remaining entities in srv/cat-service.cds file (The Tests entity has already been declared). 
  3. Generate an empty set of initial csv files and then manually populate them with about two or more records of data each. Note: remember the relationships that exist between entities when populating the records. 

 

Resources 

Here are some resources to guide you through this task: 

CDS Command line Interface tools 

Domain modeling 

Compositions vs. Associations 

Modeling to many associations 

Modeling services in CDS 

Providing Initial Data 

 

Task checklist 

Run the application (cds watch). Note that the initial errors displayed in the terminal after our development environment setup should have disappeared.   

Click on the URL that the server is listening on to access the page displayed below: 

Launched page.png

Under Service Endpoints, click on $metadata and post a screenshot into this discussion thread. Collapse other sections and focus on the <EntityType Name=”...”> tags as shown below.  

week 1 res.png
141 REPLIES 141

0 Kudos

Check your Tests entity, there is a tiny piece missing in your model (The attribute Partner in your <NavigationProperty Name="questions">). Hint: backlink

DKarthick
Galactic 1
Galactic 1

Ashok_Easa
Galactic 3
Galactic 3

MYR
Stellar 2
Stellar 2

andrew_mak
Galactic 2
Galactic 2

davidkrcek
Galactic 1
Galactic 1

challange_cap_2023_1.png

David Krcek
SAP Basis Business Unit Leader
consolut.gmbh | Karlstraße 12 | D-80333 München

Yauheni_Kalodka
Galactic 2
Galactic 2

kiryl-haupt
Galactic 2
Galactic 2

tobiasz_h
Galactic 3
Galactic 3

0 Kudos

There is a tiny piece missing in your model in the Tests entity - (The attribute Partner in your <NavigationProperty Name="questions">). Hint: backlink

Thank you for you comment.
Here is a revised version:

tobiasz_h_0-1694593336198.png

 

AlexRazhok
Galactic 1
Galactic 1

dvontress
Galactic 2
Galactic 2

iarchos
Galactic 1
Galactic 1

userzz
Galactic 2
Galactic 2

barretoj20
Stellar 2
Stellar 2

subhajit
Galactic 3
Galactic 3

r00k13d3v
Galactic 2
Galactic 2

erickgrilo
Galactic 2
Galactic 2

0 Kudos

There is a tiny piece missing in your model in the Tests entity - (The attribute Partner in your <NavigationProperty Name="questions">). Hint: backlink

MeriemSouissi
Galactic 3
Galactic 3

Abhi_Balagaon
Galactic 1
Galactic 1

0 Kudos

There is a tiny piece missing in your model in the Tests entity - (The attribute Partner in your <NavigationProperty Name="questions">). Hint: backlink

Hello Dinah, I have corrected the sameScreenshot 2023-09-16 at 4.56.08 PM.png

vignesh_narayan
Employee
Employee

0 Kudos

There's a tiny piece missing in your model in the Tests entity - (The attribute Partner in your <NavigationProperty Name="questions">). Hint: backlink

Hello Dinah. I have corrected it !

vignesh_narayan_2-1694754223264.png

 

 

 

 

emiliocampo
Galactic 3
Galactic 3

MadhavKumar
Galactic 3
Galactic 3

garyzuo
Galactic 1
Galactic 1

0 Kudos

There is something missing: the questions entity does not have a relationship with the Questions_answer entity. A NavigationProperty of the answer should exist in the Questions entity. Something similar to the <NavigationProperty name="test"....> in the Questions entity.

axitycesarfelce
Galactic 1
Galactic 1
0 Kudos

Hi, 
I'm missing the Questions_answer entity, I have the aspect , and the Backlink, but i don't see it in the metadata 😞
challenge.jpg

Saludos,

 

0 Kudos

Hi,

It looks like you have not modeled the relationship between questions and answers entities. Hint: a question can only have one answer and an answer cannot exist without a question. Compositions vs Associations

Alpesa
Galactic 3
Galactic 3

 

 

 

<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Common.xml">
<edmx:Include Alias="Common" Namespace="com.sap.vocabularies.Common.v1"/>
</edmx:Reference>
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Core.V1.xml">
<edmx:Include Alias="Core" Namespace="Org.OData.Core.V1"/>
</edmx:Reference>
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/UI.xml">
<edmx:Include Alias="UI" Namespace="com.sap.vocabularies.UI.v1"/>
</edmx:Reference>
<edmx:DataServices>
<Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="DevChallengeService">
<EntityContainer Name="EntityContainer">
<EntitySet Name="Tests" EntityType="DevChallengeService.Tests">
<NavigationPropertyBinding Path="questions" Target="Questions"/>
<NavigationPropertyBinding Path="SiblingEntity" Target="Tests"/>
</EntitySet>
<EntitySet Name="Questions" EntityType="DevChallengeService.Questions">
<NavigationPropertyBinding Path="test" Target="Tests"/>
<NavigationPropertyBinding Path="answer" Target="Questions_answer"/>
</EntitySet>
<EntitySet Name="Questions_answer" EntityType="DevChallengeService.Questions_answer">
<NavigationPropertyBinding Path="up_" Target="Questions"/>
</EntitySet>
</EntityContainer>
<EntityType Name="Tests">
<Key>
<PropertyRef Name="ID"/>
<PropertyRef Name="IsActiveEntity"/>
</Key>
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
<Property Name="createdAt" Type="Edm.DateTimeOffset" Precision="7"/>
<Property Name="createdBy" Type="Edm.String" MaxLength="256"/>
<Property Name="modifiedAt" Type="Edm.DateTimeOffset" Precision="7"/>
<Property Name="modifiedBy" Type="Edm.String" MaxLength="256"/>
<NavigationProperty Name="questions" Type="Collection(DevChallengeService.Questions)" Partner="test"/>
<Property Name="title" Type="Edm.String"/>
<Property Name="description" Type="Edm.String"/>
<Property Name="IsActiveEntity" Type="Edm.Boolean" Nullable="false" DefaultValue="true"/>
<Property Name="HasActiveEntity" Type="Edm.Boolean" Nullable="false" DefaultValue="false"/>
<Property Name="HasDraftEntity" Type="Edm.Boolean" Nullable="false" DefaultValue="false"/>
<NavigationProperty Name="DraftAdministrativeData" Type="DevChallengeService.DraftAdministrativeData" ContainsTarget="true"/>
<NavigationProperty Name="SiblingEntity" Type="DevChallengeService.Tests"/>
</EntityType>
<EntityType Name="Questions">
<Key>
<PropertyRef Name="ID"/>
</Key>
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
<NavigationProperty Name="test" Type="DevChallengeService.Tests" Partner="questions">
<ReferentialConstraint Property="test_ID" ReferencedProperty="ID"/>
</NavigationProperty>
<Property Name="test_ID" Type="Edm.Guid"/>
<Property Name="text" Type="Edm.String"/>
<NavigationProperty Name="answer" Type="DevChallengeService.Questions_answer" Partner="up_">
<OnDelete Action="Cascade"/>
<ReferentialConstraint Property="ID" ReferencedProperty="up__ID"/>
</NavigationProperty>
</EntityType>
<EntityType Name="DraftAdministrativeData">
<Key>
<PropertyRef Name="DraftUUID"/>
</Key>
<Property Name="DraftUUID" Type="Edm.Guid" Nullable="false"/>
<Property Name="CreationDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
<Property Name="CreatedByUser" Type="Edm.String" MaxLength="256"/>
<Property Name="DraftIsCreatedByMe" Type="Edm.Boolean"/>
<Property Name="LastChangeDateTime" Type="Edm.DateTimeOffset" Precision="7"/>
<Property Name="LastChangedByUser" Type="Edm.String" MaxLength="256"/>
<Property Name="InProcessByUser" Type="Edm.String" MaxLength="256"/>
<Property Name="DraftIsProcessedByMe" Type="Edm.Boolean"/>
</EntityType>
<EntityType Name="Questions_answer">
<Key>
<PropertyRef Name="up__ID"/>
<PropertyRef Name="ID"/>
</Key>
<NavigationProperty Name="up_" Type="DevChallengeService.Questions" Nullable="false" Partner="answer">
<ReferentialConstraint Property="up__ID" ReferencedProperty="ID"/>
</NavigationProperty>
<Property Name="up__ID" Type="Edm.Guid" Nullable="false"/>
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
<Property Name="text" Type="Edm.String"/>
</EntityType>
<Action Name="draftPrepare" IsBound="true" EntitySetPath="in">
<Parameter Name="in" Type="DevChallengeService.Tests"/>
<Parameter Name="SideEffectsQualifier" Type="Edm.String"/>
<ReturnType Type="DevChallengeService.Tests"/>
</Action>
<Action Name="draftActivate" IsBound="true" EntitySetPath="in">
<Parameter Name="in" Type="DevChallengeService.Tests"/>
<ReturnType Type="DevChallengeService.Tests"/>
</Action>
<Action Name="draftEdit" IsBound="true" EntitySetPath="in">
<Parameter Name="in" Type="DevChallengeService.Tests"/>
<Parameter Name="PreserveChanges" Type="Edm.Boolean"/>
<ReturnType Type="DevChallengeService.Tests"/>
</Action>
<Annotations Target="DevChallengeService.EntityContainer/Tests">
<Annotation Term="Common.DraftRoot">
<Record Type="Common.DraftRootType">
<PropertyValue Property="ActivationAction" String="DevChallengeService.draftActivate"/>
<PropertyValue Property="EditAction" String="DevChallengeService.draftEdit"/>
<PropertyValue Property="PreparationAction" String="DevChallengeService.draftPrepare"/>
</Record>
</Annotation>
</Annotations>
<Annotations Target="DevChallengeService.Tests/IsActiveEntity">
<Annotation Term="UI.Hidden" Bool="true"/>
</Annotations>
<Annotations Target="DevChallengeService.Tests/HasActiveEntity">
<Annotation Term="UI.Hidden" Bool="true"/>
</Annotations>
<Annotations Target="DevChallengeService.Tests/HasDraftEntity">
<Annotation Term="UI.Hidden" Bool="true"/>
</Annotations>
<Annotations Target="DevChallengeService.Tests/DraftAdministrativeData">
<Annotation Term="UI.Hidden" Bool="true"/>
</Annotations>
<Annotations Target="DevChallengeService.DraftAdministrativeData">
<Annotation Term="Common.Label" String="Datos administrativos en borrador"/>
</Annotations>
<Annotations Target="DevChallengeService.DraftAdministrativeData/DraftUUID">
<Annotation Term="UI.Hidden" Bool="true"/>
<Annotation Term="Common.Label" String="Borrador (ID técnico)"/>
</Annotations>
<Annotations Target="DevChallengeService.DraftAdministrativeData/CreationDateTime">
<Annotation Term="Common.Label" String="Borrador creado el"/>
</Annotations>
<Annotations Target="DevChallengeService.DraftAdministrativeData/CreatedByUser">
<Annotation Term="Common.Label" String="Borrador creado por"/>
</Annotations>
<Annotations Target="DevChallengeService.DraftAdministrativeData/DraftIsCreatedByMe">
<Annotation Term="UI.Hidden" Bool="true"/>
<Annotation Term="Common.Label" String="Borrador creado por mí"/>
</Annotations>
<Annotations Target="DevChallengeService.DraftAdministrativeData/LastChangeDateTime">
<Annotation Term="Common.Label" String="Fecha del último cambio en borrador"/>
</Annotations>
<Annotations Target="DevChallengeService.DraftAdministrativeData/LastChangedByUser">
<Annotation Term="Common.Label" String="Autor del último cambio en borrador"/>
</Annotations>
<Annotations Target="DevChallengeService.DraftAdministrativeData/InProcessByUser">
<Annotation Term="Common.Label" String="Borrador en proceso por"/>
</Annotations>
<Annotations Target="DevChallengeService.DraftAdministrativeData/DraftIsProcessedByMe">
<Annotation Term="UI.Hidden" Bool="true"/>
<Annotation Term="Common.Label" String="Borrador en proceso por mí"/>
</Annotations>
</Schema>
</edmx:DataServices>
</edmx:Edmx>