© 2026 Hedgehog Software, LLC

TwitterGitHubDiscord
More
CommunitiesDocsAboutTermsPrivacy
Search
Star
Setup for Free
C#C
C#•7mo ago•
10 replies
Emilija

Database Design

Hello everyone, I'm building a travel reservation system and need help deciding between two approaches for modeling package details.

I already have:
TravelPackage (base class/table): common fields like PackageID, Name, Price, PackageType
TravelPackage (base class/table): common fields like PackageID, Name, Price, PackageType

Subtypes like:
SeaPackage
MountainPackage
CruisePackage
ExcursionPackage
SeaPackage
MountainPackage
CruisePackage
ExcursionPackage

Each subtype has its own specific fields (e.g.
Activities, Ship, Guide, etc
Activities, Ship, Guide, etc
). Now I’m unsure which design is better:

Option 1: Inheritance
Make each subtype extend TravelPackage using single-table or joined-table inheritance. That way, each specialized package is a real subclass of TravelPackage.

Option 2: Composition
Keep TravelPackage as a standalone entity and have a related PackageDetails entity (or 4 separate ones) that hold the specific fields. The PackageType would determine which detail table to join.

Option 1:
Client(ClientID PK, FirstName, LastName, PassportNo, BirthDate, Email, Phone)
 TravelPackage(PackageID PK, Name, Price, PackageType)
 SeaPackage(PackageID PK/FK→TravelPackage, Destination, TransportType, LodgingType)
 MountainPackage(PackageID PK/FK→TravelPackage, Destination, TransportType, LodgingType, Activities)
 Excursion(PackageID PK/FK→TravelPackage, Destination, TransportType, Guide, Duration)
 Cruise(PackageID PK/FK→TravelPackage, Ship, Route, DepartureDate, CabinType)
 Reservation(ReservationID PK, ClientID FK→Client, PackageID FK→TravelPackage, BookingDate, ...)
Client(ClientID PK, FirstName, LastName, PassportNo, BirthDate, Email, Phone)
 TravelPackage(PackageID PK, Name, Price, PackageType)
 SeaPackage(PackageID PK/FK→TravelPackage, Destination, TransportType, LodgingType)
 MountainPackage(PackageID PK/FK→TravelPackage, Destination, TransportType, LodgingType, Activities)
 Excursion(PackageID PK/FK→TravelPackage, Destination, TransportType, Guide, Duration)
 Cruise(PackageID PK/FK→TravelPackage, Ship, Route, DepartureDate, CabinType)
 Reservation(ReservationID PK, ClientID FK→Client, PackageID FK→TravelPackage, BookingDate, ...)


Option 2:
Client(ID PK, FirstName, LastName, PassportNo, BirthDate, Email, Phone)
Packages(ID PK, Name, Price, DetailsID FK->PackageDetails)
PackageDetails(ID PK, PackageDetailsTypeID( fk -> PackageTypes) )
PackageDetailsTypes(ID, PK, Name)
BeachPackageDetails(ID PK, FK -> PackageDetails, DestinationID, TransportTypeID, AccommodationTypeID )
Client(ID PK, FirstName, LastName, PassportNo, BirthDate, Email, Phone)
Packages(ID PK, Name, Price, DetailsID FK->PackageDetails)
PackageDetails(ID PK, PackageDetailsTypeID( fk -> PackageTypes) )
PackageDetailsTypes(ID, PK, Name)
BeachPackageDetails(ID PK, FK -> PackageDetails, DestinationID, TransportTypeID, AccommodationTypeID )

And for the rest of them..

Which option is better, and how would i contruct my entities and repositories? Will i have inheritance in every case(1.For packages, 2.For PackageDetails)? Thank you in advance ❤️
C# banner
C#Join
We are a programming server aimed at coders discussing everything related to C# (CSharp) and .NET.
61,871Members
Resources
Was this page helpful?

Similar Threads

Recent Announcements

Similar Threads

Database Design
C#CC# / help
3y ago
✅ Zoo database design
C#CC# / help
3y ago
✅ Database Design and C# cass
C#CC# / help
6mo ago
Snowflake Database Service Design Pattern
C#CC# / help
13mo ago