Report Template
Report Template
2025
Group Members:
1 of 17
Task 1 – Conceptual Design (45%)
Business Rules Based on Scenario :
1. Area Definition and Facilities: Each area must have a unique identifier (AreaID),
name, location, area size, and a list of facilities, with facilities stored in the
AreaFacilities entity (AreaID, Facility) to allow multiple facilities per area.
2. Experience Definition: Each experience must have a unique identifier (ExperienceID),
name, capacity, and exactly one associated experience type, as defined by the
Experience and ExperienceType entities.
3. Venue Containment: Each venue must be located in exactly one area (via AreaID)
and can house zero or more experiences, as indicated by the Contains (Area to Venue)
and Houses (Venue to Experience) relationships.
4. Experience Location Constraint: Each experience must be associated with either
one area directly or one venue (which is within an area), but not both, as implied by the
mutually exclusive relationships between Experience and Area or Venue.
5. Ticket Class Specification: Each ticket class must have a unique identifier
(TicketClassID), class name, description, and price, as stored in the TicketClass entity,
and can be associated with multiple purchases via the PurchaseTicketClass entity.
6. Member Details and Relationships: Each member must have a unique identifier
(MemberID), given name, surname, email address, date of birth, state, and country of
residence, and can receive updates and promotions, as linked via EventID and
PromotionID in the Member entity.
7. Member Purchases: Each member can have multiple purchase records in the
PurchasesHistory entity (MemberID, PurchaseID), with each purchase including a date,
points gained, and associated ticket classes via the PurchaseTicketClass entity.
8. Personnel Details and Supervision: Each personnel must have a unique identifier
(PersonnelID), given name, surname, mobile number, email address, and date of birth,
and may have one supervisor (another personnel via SupervisorPersonnelID), as
indicated by the self-referencing Supervisors relationship in the Personnel entity.
9. Role Allocation for Personnel: Each personnel can have multiple role allocations in
the RoleAllocation entity, linking one personnel to one role type (RoleTypeID,
description, pay rate) from RoleType and one seniority level (SeniorityLevelID, level
description, pay loading percentage) from SeniorityLevel, with no duplicate
combinations of role type and seniority level per personnel.
10.Rostering Personnel: Each roster entry in the Roster entity (DateOfRoster, start time,
duration) can have multiple assignments in the RosterAssignmentHistory entity
(DateOfRoster, HistoryID), linking personnel to experiences they support.
11.Maintenance Scheduling: Each maintenance schedule in the MaintenanceSchedule
entity must have a unique identifier (ScheduleID), be associated with one experience
(via ExperienceID), include a description of work, start date, end date, status, and be
overseen by one personnel (via PersonnelID).
12.Curated Recommendation Structure: Each curated recommendation in the
CuratedRecommendation entity must have a unique identifier (CuratedID), title,
description, recommended age group, thrill level, one starting experience, one ending
experience, and up to 10 in-between experiences in a specific sequence, managed via
the VisitExperience entity (CuratedID, Position, ExperienceID).
2 of 17
Additional Business Rule (Curated_Rating)
Additional Business Rule: Members can submit ratings for experiences they have
visited, with each rating recorded in the Curated_Rating entity, including a rating score,
comment, and date, uniquely identified by the combination of MemberID and
ExperienceID.
Assumptions (7 Assumptions)
3 of 17
ER Model in Crow’s Foot Notation :
4 of 17
Task 2 – Logical Design (45%)
Process Overview:
Step 1 Convert Strong Entity
- Area (AreaID(PK), Name, Location, Facilities, AreaSize)
- Member (MemberID(PK), GivenName, Surname, EmailAddress, DOB, State,
CountryOfResidence)
- Experience (ExperienceID(PK), Name, Capacity)
- MaintenanceSchedule (ScheduleID(PK), DescriptionOfWork, StartDate, EndDate,
Status, PointOfContactStaff)
- RoleType (RoleTypeID(PK), Description, PayLoad)
- Roster (DateOfRoster(PK), StartTime(hours), Duration(hours))
- TicketClasses (TicketClassID(PK), ClassName, Description, Price)
- Personnel (PersonnelID(PK), GivenName, Surname, MobileNum, EmailAddress, DOB)
- SeniorityLevel (SeniorityLevelID(PK), SeniorityLevel, LevelDescription, PayLoad)
- Promotion (PromotionID(PK), Description, StartDate, EndDate)
- CuratedRecommendation (CuratedID(PK), Title, Description, AgeGroup, ThrillLevel)
- Update (EventID (PK), Description, StartDate, EndDate)
5 of 17
Step 5 Convert Many to Many
- PurchasesHistory (MemberID(PK, FK), PurchaseID(PK), Date, PointsGained)
- PurchaseTicketClass (MemberID(PK, FK), PurchaseID(PK, FK), TicketClassID(PK, FK))
6 of 17
Step-by-Step Process for Logical Transformation
Step 1: Identify Strong Entities
Objective: List tables for all strong entities, including all simple attributes and
marking the primary key as "PK." Exclude multi-valued attributes at this stage.
Process: Strong entities exist independently and have a unique primary identifier. I’ll
identify these from the ERD in Attachment 4 and create initial tables with simple
attributes only.
Area
o Attributes: AreaID (PK), Name, Location, Facilities, AreaSize
o Table: Area (AreaID(PK), Name, Location, Facilities, AreaSize)
Member
o Attributes: MemberID (PK), GivenName, Surname, EmailAddress, DOB,
State, CountryOfResidence, PurchaseHistory
o Note: PurchaseHistory is likely multi-valued (implied by its context as a
history of purchases), so it’s excluded here.
o Table: Member (MemberID(PK), GivenName, Surname, EmailAddress, DOB,
State, CountryOfResidence)
Experience
o Attributes: ExperienceID (PK), Name, Capacity
o Table: Experience (ExperienceID(PK), Name, Capacity)
MaintenanceSchedule
o Attributes: ScheduleID (PK), DescriptionOfWork, StartDate, EndDate,
Status, PointOfContactStaff
o Table: MaintenanceSchedule (ScheduleID(PK), DescriptionOfWork,
StartDate, EndDate, Status, PointOfContactStaff)
RoleType
o Attributes: RoleTypeID (PK), Description, PayLoad
o Note: PayLoad(%) is simplified to PayLoad for consistency.
o Table: RoleType (RoleTypeID(PK), Description, PayLoad)
Roster
o Attributes: DateOfRoster (PK), StartTime(hours), Duration(hours)
o Note: StartTime and Duration include "hours" in the ERD, which I retain for
clarity.
o Table: Roster (DateOfRoster(PK), StartTime(hours), Duration(hours))
TicketClasses
o Attributes: TicketClassID (PK), ClassName, Description, Price
o Table: TicketClasses (TicketClassID(PK), ClassName, Description, Price)
Personnel
o Attributes: PersonnelID (PK), GivenName, Surname, MobileNum,
EmailAddress, DOB
o Table: Personnel (PersonnelID(PK), GivenName, Surname, MobileNum,
EmailAddress, DOB)
7 of 17
SeniorityLevel
o Attributes: SeniorityLevelID (PK), SeniorityLevel, LevelDescription, PayLoad
o Table: SeniorityLevel (SeniorityLevelID(PK), SeniorityLevel,
LevelDescription, PayLoad)
Promotion
o Attributes: PromotionID (PK), Description, StartDate, EndDate
o Table: Promotion (PromotionID(PK), Description, StartDate, EndDate)
CuratedRecommendation
o Attributes: CuratedID (PK), Title, Description, AgeGroup, ThrillLevel
o Table: CuratedRecommendation (CuratedID(PK), Title, Description,
AgeGroup, ThrillLevel)
Updates
o Attributes: EventID (PI), Description, StartDate, EndDate
o Table: Update (EventID (PK), Description, StartDate, EndDate)
Tables After Step 1:
Objective: Create tables for weak entities, where the primary key is a composite of
the owner’s primary key (as a foreign key, FK) and the weak entity’s main attribute.
Process: Weak entities depend on a strong entity (owner) and lack a standalone
unique identifier. Their primary key combines the owner’s PK with a partial key.
PurchasesHistory
o Owner: Member (PK: MemberID)
o Attributes: PurchaseID, Date, PointsGained, TicketClass
o Partial Key: PurchaseID
8 of 17
o Table: PurchasesHistory (MemberID(PK, FK), PurchaseID (PK), Date,
PointsGained, TicketClass)
RosterAssignmentHistory
o Owner: Roster (PK: DateOfRoster)
o Attributes: HistoryID, DateOfRoster, StartTime(hours), Duration(hours)
o Note: The ERD lists DateOfRoster as an attribute, which overlaps with the
owner’s PK.
o Table: RosterAssignmentHistory (DateOfRoster(PK, FK), HistoryID (PK)
StartTime(hours), Duration(hours))
Venue (Weak Entity):
o Owner: Area (PK: AreaID).
o Attributes: VenueID(PI), Name, Location.
o Note: As a weak entity, Venue’s primary key must include the owner’s PK
(AreaID). VenueID serves as the partial key to ensure uniqueness within
each Area. The "Contains" relationship is now identifying (solid line),
reflecting Venue’s dependency on Area. The "Houses" relationship (1:N)
will add VenueID as a foreign key to Experience in Step 4.
o Table: Venue (AreaID(PK, FK), VenueID(PK), Name, Location).
ExperienceType (Weak Entity):
o Owner: Experience (PK: ExperienceID).
o Attributes: TypeID(PI), Name.
o Note: As a weak entity, ExperienceType’s primary key must include the
owner’s PK (ExperienceID). TypeID serves as the partial key to ensure
uniqueness within each Experience.
o Table: ExperienceType (ExperienceID(PK, FK), TypeID(PK), Name).
Tables After Step 2 (adding new tables):
Objective: For each 1:1 relationship, add the primary key of one entity (usually the
mandatory side) as a foreign key in the other entity’s table.
Objective: Include the primary key of the "1" side as a foreign key in the "N" side of
the relationship.
Process: Identify 1:N relationships (single line with an arrow or context suggesting
one-to-many). Add the PK from the "1" side to the "N" side table.
10 of 17
Explanation: Each CuratedRecommendation is now linked to a single Experience
via ExperienceID(FK), reflecting that many curated recommendations can
support one experience. This reverses the previous transformation where
CuratedID was added to Experience.
11 of 17
o Updated Table: Member (MemberID(PK), GivenName, Surname,
EmailAddress, DOB, State, CountryOfResidence, PromotionID(FK))
Supports (CuratedRecommendation to Experience)
Relationship: CuratedRecommendation (N) to Experience (1)
Action: Add ExperienceID (PK of Experience) as a foreign key to
CuratedRecommendation (the "N" side).
Updated Table: CuratedRecommendation (CuratedID(PK), Title, Description,
AgeGroup, ThrillLevel, ExperienceID(FK))
Explanation: Each CuratedRecommendation is now linked to a single Experience
via ExperienceID(FK), reflecting that many curated recommendations can
support one experience. This reverses the previous transformation where
CuratedID was added to Experience.
Objective: Create a new associative table for each M:N relationship, with a composite
primary key from the two entities’ primary keys, including any relationship attributes.
Process: Identify M:N relationships (typically shown with double lines or context
suggesting many-to-many). Create new tables accordingly.
References (PurchasesHistory to TicketClass)
o Relationship: PurchasesHistory (M) to TicketClass (N) (adjusted from one-to-
many to many-to-many, as a single purchase can involve multiple ticket classes,
and a ticket class can be part of multiple purchases).
12 of 17
o Action: Create a new associative table PurchaseTicketClass with a composite
primary key from PurchasesHistory (MemberID, PurchaseID) and TicketClass
(TicketClassID).
o New Table: PurchaseTicketClass (MemberID(PK, FK), PurchaseID(PK, FK),
TicketClassID(PK, FK))
Explanation: This table links PurchasesHistory and TicketClass, allowing a single
purchase to include multiple ticket classes and a ticket class to be part of multiple
purchases.
Update to PurchasesHistory (Removing TicketClass Attribute)
o Reason for Removal: The TicketClass attribute (previously replaced by
TicketClassID(FK) in Step 4) in PurchasesHistory is removed because the many-
to-many relationship is now handled by the PurchaseTicketClass table. Including
TicketClassID directly in PurchasesHistory would imply a one-to-many
relationship, which is no longer accurate.
Updated Table: PurchasesHistory (MemberID(PK, FK), PurchaseID(PK), Date,
PointsGained)
Explanation: The direct reference to TicketClass is removed from PurchasesHistory to
avoid redundancy and maintain normalization, as the relationship is now managed
through the associative table.
Tables After Step 5 (Updated/New Tables):
PurchasesHistory (MemberID(PK, FK), PurchaseID(PK), Date, PointsGained) –updated by
removing tickerclassID (FK) as it is redundant through the many-to-many relationship
table.
PurchaseTicketClass (MemberID(PK, FK), PurchaseID(PK, FK), TicketClassID(PK, FK))
Objective: Create a new table for each multi-valued attribute, including the attribute
and the entity’s primary key.
Area
13 of 17
AreaFacilities (AreaID(PK, FK), Facility(PK))
Process: Identify entities that represent relationships (often from M:N or ternary
relationships) and ensure proper key structure.
Objective: Combine all tables, using the most updated versions, and remove
duplicates by going bottom-up.
Process: Collect all tables from Steps 1–7, ensuring each reflects modifications (e.g.,
foreign keys added in Steps 3–4). Eliminate duplicates by retaining the latest version.
15 of 17
18. Experience (ExperienceID(PK), Name, Capacity, VenueID(FK))
19. Member (MemberID(PK), GivenName, Surname, EmailAddress, DOB, State,
CountryOfResidence, PromotionID(FK), EventID(FK))
20. Area (AreaID(PK), Name, Location, AreaSize, VenueID(FK))
21. PurchaseTicketClass (MemberID(PK, FK), PurchaseID(PK, FK),
TicketClassID(PK, FK))
In Alphabetical order:
16 of 17
Task 3 – Physical Design (10%)
17 of 17