Domänenmodell¶
Das folgende Entity-Relationship-Diagramm ist die Landkarte der TxRide-Daten. Im Kern stehen drei Konzepte:
RideOffer– eine angebotene Fahrt einer Fahrerin oder eines Fahrers, mit Richtung (OUTBOUND/RETURN), Abfahrtszeit und freien Plätzen.RideRequest– ein Fahrtgesuch einer mitfahrenden Person, definiert über früheste/späteste Zeit am Zentrum statt über eine Abfahrtszeit.Match– die Verbindung zwischen Angebot und Gesuch; durchläuft die Zustände vonPROPOSEDbisCOMPLETED.
Hin- und Rückfahrten werden über die Selbstbezüge linkedOffer bzw. linkedRequest miteinander verknüpft.
Automatisch generiert
Dieses Diagramm wird bei bun run db:generate über den prisma-erd-generator direkt aus packages/db/prisma/schema.prisma erzeugt. Pflege es nicht von Hand – das Prisma-Schema bleibt die Quelle der Wahrheit.
erDiagram
RideOfferStatus {
OPEN OPEN
MATCHED MATCHED
CANCELLED CANCELLED
COMPLETED COMPLETED
}
RideRequestStatus {
OPEN OPEN
MATCHED MATCHED
CANCELLED CANCELLED
FULFILLED FULFILLED
}
MatchStatus {
PROPOSED PROPOSED
ACCEPTED ACCEPTED
DECLINED DECLINED
CANCELLED CANCELLED
COMPLETED COMPLETED
}
RideDirection {
OUTBOUND OUTBOUND
RETURN RETURN
}
"Item" {
String id "PK"
String name
DateTime createdAt
}
"User" {
String id "PK"
String keycloakSub
String email
String displayName
String matrixUserId "nullable"
DateTime createdAt
DateTime updatedAt
}
"ActivationCode" {
String id "PK"
String code
DateTime expiresAt "nullable"
DateTime redeemedAt "nullable"
String redeemedSub "nullable"
String redeemedEmail "nullable"
DateTime createdAt
}
"Address" {
String id "PK"
String street
String houseNumber "nullable"
String postalCode
String city
String country
Float latitude "nullable"
Float longitude "nullable"
DateTime createdAt
}
"TransplantationCenter" {
String id "PK"
String name
DateTime createdAt
}
"RideOffer" {
String id "PK"
RideDirection direction
DateTime departureAt
Int seatsTotal
Int seatsAvailable
RideOfferStatus status
String notes "nullable"
String specialties "nullable"
DateTime createdAt
DateTime updatedAt
}
"RideRequest" {
String id "PK"
RideDirection direction
DateTime earliestAt "nullable"
DateTime latestAt "nullable"
Int seats
RideRequestStatus status
String notes "nullable"
DateTime createdAt
DateTime updatedAt
}
"Match" {
String id "PK"
MatchStatus status
String matrixRoomId "nullable"
DateTime createdAt
DateTime updatedAt
}
"User" |o--|o "Address" : "homeAddress"
"ActivationCode" |o--|o "User" : "redeemedBy"
"TransplantationCenter" |o--|| "Address" : "address"
"RideOffer" |o--|| "RideDirection" : "enum:direction"
"RideOffer" |o--|| "RideOfferStatus" : "enum:status"
"RideOffer" }o--|| "User" : "driver"
"RideOffer" }o--|| "Address" : "startAddress"
"RideOffer" }o--|| "TransplantationCenter" : "destinationCenter"
"RideOffer" |o--|o "RideOffer" : "linkedOffer"
"RideRequest" |o--|| "RideDirection" : "enum:direction"
"RideRequest" |o--|| "RideRequestStatus" : "enum:status"
"RideRequest" }o--|| "User" : "passenger"
"RideRequest" }o--|| "Address" : "startAddress"
"RideRequest" }o--|| "TransplantationCenter" : "destinationCenter"
"RideRequest" |o--|o "RideRequest" : "linkedRequest"
"Match" |o--|| "MatchStatus" : "enum:status"
"Match" }o--|| "RideOffer" : "offer"
"Match" }o--|| "RideRequest" : "request"